Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw β€’ Download


RNS/Utilities/rngit/pages.py HEAD (3535327f) Text, 101.99 KB

T8b949e# Reticulum License
T8b949e#
T8b949e# Copyright (c) 2016-2026 Mark Qvist
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# - The Software shall not be used in any kind of system which includes amongst
T8b949e# its functions the ability to purposefully do harm to human beings.
T8b949e#
T8b949e# - The Software shall not be used, directly or indirectly, in the creation of
T8b949e# an artificial intelligence, machine learning or language model training
T8b949e# dataset, including but not limited to any use that contributes to the
T8b949e# training or development of such a model or algorithm.
T8b949e#
T8b949e# - The above copyright notice and this permission notice shall be included in
T8b949e# all copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72import T7ee787os
Tff7b72import T7ee787time
Tff7b72import T7ee787threading
Tff7b72import T7ee787subprocess
Tff7b72import T7ee787urllibT7ee787.T7ee787parse
Tff7b72import T7ee787RNS
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetime
Tff7b72from T7ee787RNST7ee787.T7ee787UtilitiesT7ee787.T7ee787rngit Tff7b72import Te6edf3APP_NAME
Tff7b72from T7ee787RNST7ee787.T7ee787UtilitiesT7ee787.T7ee787rngitT7ee787.T7ee787util Tff7b72import Te6edf3MarkdownToMicron
Tff7b72from T7ee787RNST7ee787.T7ee787UtilitiesT7ee787.T7ee787rngitT7ee787.T7ee787highlight Tff7b72import Te6edf3SyntaxHighlighter
Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787configobj Tff7b72import Te6edf3ConfigObj
Tff7b72from T7ee787RNST7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3mp
Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__

Tff7b72class T56d364NomadNetworkNodeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3APP_NAME Tff7b72= Ta5d6ff"Ta5d6ffnomadnetworkTa5d6ff"
Te6edf3JOBS_INTERVAL Tff7b72= T79c0ff5

Te6edf3PATH_INDEX Tff7b72= Ta5d6ff"Ta5d6ff/page/index.muTa5d6ff"
Te6edf3PATH_GROUP Tff7b72= Ta5d6ff"Ta5d6ff/page/group.muTa5d6ff"
Te6edf3PATH_REPO Tff7b72= Ta5d6ff"Ta5d6ff/page/repo.muTa5d6ff"
Te6edf3PATH_TREE Tff7b72= Ta5d6ff"Ta5d6ff/page/tree.muTa5d6ff"
Te6edf3PATH_BLOB Tff7b72= Ta5d6ff"Ta5d6ff/page/blob.muTa5d6ff"
Te6edf3PATH_COMMITS Tff7b72= Ta5d6ff"Ta5d6ff/page/commits.muTa5d6ff"
Te6edf3PATH_COMMIT Tff7b72= Ta5d6ff"Ta5d6ff/page/commit.muTa5d6ff"
Te6edf3PATH_REFS Tff7b72= Ta5d6ff"Ta5d6ff/page/refs.muTa5d6ff"
Te6edf3PATH_STATS Tff7b72= Ta5d6ff"Ta5d6ff/page/stats.muTa5d6ff"
Te6edf3PATH_RELEASES Tff7b72= Ta5d6ff"Ta5d6ff/page/releases.muTa5d6ff"
Te6edf3PATH_RELEASE Tff7b72= Ta5d6ff"Ta5d6ff/page/release.muTa5d6ff"
Te6edf3PATH_ARTIFACT Tff7b72= Ta5d6ff"Ta5d6ff/file/artifactTa5d6ff"
Te6edf3PATH_DOWNLOAD Tff7b72= Ta5d6ff"Ta5d6ff/file/downloadTa5d6ff"

Te6edf3BLOB_SIZE_LIMIT Tff7b72= T79c0ff256 Tff7b72* T79c0ff1024
Te6edf3TREE_ENTRIES_PER_PAGE Tff7b72= T79c0ff1000
Te6edf3COMMITS_PER_PAGE Tff7b72= T79c0ff100
Te6edf3SHOW_DIFF_BY_DEFAULT Tff7b72= Tff7b72True
Te6edf3GIT_COMMAND_TIMEOUT Tff7b72= T79c0ff5
Te6edf3MAX_RENDER_WIDTH Tff7b72= T79c0ff100
Te6edf3USE_NERDFONTS Tff7b72= Tff7b72True

Te6edf3U_ICON_SEP Tff7b72= Ta5d6ff"Ta5d6ffβ€’Ta5d6ff"
Te6edf3U_ICON_FOLDER Tff7b72= Ta5d6ff"Ta5d6ffπŸ—€Ta5d6ff"
Te6edf3U_ICON_FILE Tff7b72= Ta5d6ff"Ta5d6ffπŸ—ŽTa5d6ff"
Te6edf3U_ICON_BRANCH Tff7b72= Ta5d6ff"Ta5d6ff⑃Ta5d6ff"
Te6edf3U_ICON_TAG Tff7b72= Ta5d6ff"Ta5d6ffβŒ†Ta5d6ff"
Te6edf3U_ICON_COMMITS Tff7b72= Ta5d6ff"Ta5d6ffπŸ–ΉTa5d6ff"
Te6edf3U_ICON_STATS Tff7b72= Ta5d6ff"Ta5d6ffπŸ— Ta5d6ff"
Te6edf3U_ICON_HEART Tff7b72= Ta5d6ff"Ta5d6ffβ™₯Ta5d6ff"
Te6edf3U_ICON_PACKAGE Tff7b72= Ta5d6ff"Ta5d6ffβ—‡Ta5d6ff"

Te6edf3NF_ICON_SEP Tff7b72= Ta5d6ff"Ta5d6ffβ€’Ta5d6ff"
Te6edf3NF_ICON_FOLDER Tff7b72= Ta5d6ff"Ta5d6ffσ°‰–Ta5d6ff"
Te6edf3NF_ICON_FILE Tff7b72= Ta5d6ff"Ta5d6ffTa5d6ff"
Te6edf3NF_ICON_BRANCH Tff7b72= Ta5d6ff"Ta5d6ff󰘬Ta5d6ff"
Te6edf3NF_ICON_TAG Tff7b72= Ta5d6ff"Ta5d6ffσ°“ΌTa5d6ff"
Te6edf3NF_ICON_COMMITS Tff7b72= Ta5d6ff"Ta5d6ffσ°‹šTa5d6ff"
Te6edf3NF_ICON_STATS Tff7b72= Ta5d6ff"Ta5d6ffTa5d6ff"
Te6edf3NF_ICON_HEART Tff7b72= Ta5d6ff"Ta5d6ffσ°‹‘Ta5d6ff"
Te6edf3NF_ICON_PACKAGE Tff7b72= Ta5d6ff"Ta5d6ff󰏗Ta5d6ff"

Te6edf3CLR_FOLDER Tff7b72= Ta5d6ff"Ta5d6ff`Ffe6Ta5d6ff"
Te6edf3CLR_FILE Tff7b72= Ta5d6ff"Ta5d6ff`F66dTa5d6ff"
Te6edf3CLR_DIM Tff7b72= Ta5d6ff"Ta5d6ff`F666Ta5d6ff"
Te6edf3CLR_DIM_H Tff7b72= Ta5d6ff"Ta5d6ff`F444Ta5d6ff"

Te6edf3RENDERABLE_EXTS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff.mdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff.muTa5d6ff"Tb4b4b4]
Te6edf3RENDER_DEFAULT Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ff.mdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff.muTa5d6ff"Tb4b4b4]

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3ownerTb4b4b4: Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffInvalid owner Tffd700{Te6edf3ownerTffd700}Ta5d6ff for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_ready Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_should_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3ownerTff7b72.Td2a8ffidentity
Tff7b72selfTff7b72.Td2a8ffnode_name Tff7b72= Te6edf3ownerTff7b72.Td2a8ffnode_name
Tff7b72selfTff7b72.Td2a8ffannounce_interval Tff7b72= Te6edf3ownerTff7b72.Td2a8ffannounce_interval
Tff7b72selfTff7b72.Td2a8fflast_announce Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffnull_ident Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_bytesTb4b4b4(Tffa657bytesTb4b4b4(T79c0ff64Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftemplates Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffbaseTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_BASE_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6fffrontTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_FRONT_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffgroupTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_GROUP_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffrepoTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_REPO_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffreleasesTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_RELEASES_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffreleaseTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_RELEASE_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6fftreeTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_TREE_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_BLOB_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffcommitsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_COMMITS_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffcommitTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_COMMIT_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffrefsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_REFS_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffstatsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3DEFAULT_STATS_TEMPLATE
Tff7b72selfTff7b72.Td2a8fftemplatesdir Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffconfigdirTff7b72+Ta5d6ff"Ta5d6ff/templatesTa5d6ff"
Tff7b72selfTff7b72.Td2a8ffuse_nerdfonts Tff7b72= Tff7b72selfTff7b72.Td2a8ffUSE_NERDFONTS
Tff7b72selfTff7b72.Td2a8ffhighlight_syntax Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffhighlighter Tff7b72= Te6edf3SyntaxHighlighterTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmdc Tff7b72= Te6edf3MarkdownToMicronTb4b4b4(Te6edf3max_widthTff7b72=Tff7b72selfTff7b72.Td2a8ffMAX_RENDER_WIDTHTb4b4b4, Te6edf3syntax_highlighterTff7b72=Tff7b72selfTff7b72.Td2a8ffhighlighterTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffthanks_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=T79c0ff256Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Tff7b72selfTff7b72.Td2a8fftemplatesdirTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8fftemplatesdirTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not create templates directory Tffd700{Tff7b72selfTff7b72.Td2a8fftemplatesdirTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Ta5d6ff"Ta5d6ffpagesTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffconfigTb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffunicode_iconsTa5d6ff" Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffpagesTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffconfigTb4b4b4[Ta5d6ff"Ta5d6ffpagesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffas_boolTb4b4b4(Ta5d6ff"Ta5d6ffunicode_iconsTa5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffuse_nerdfonts Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Tff7b72selfTff7b72.Td2a8ffAPP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffnodeTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffremote_connectedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffset_default_app_dataTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_announce_app_dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffregister_request_handlersTb4b4b4(Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffGit Nomad Network Node listening on Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_should_run Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_ready Tff7b72= Tff7b72True

Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffjobsTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fficonTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffuse_nerdfontsTb4b4b4:
Tff7b72if Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffsepTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_SEP
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6fffolderTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_FOLDER
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_FILE
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffbranchTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_BRANCH
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffcommitsTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_COMMITS
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6fftagTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_TAG
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffstatsTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_STATS
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffheartTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_HEART
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffpackageTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffNF_ICON_PACKAGE
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff"

Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffsepTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_SEP
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6fffolderTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_FOLDER
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_FILE
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffbranchTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_BRANCH
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffcommitsTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_COMMITS
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6fftagTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_TAG
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffstatsTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_STATS
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffheartTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_HEART
Tff7b72elif Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffpackageTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffU_ICON_PACKAGE
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff"

Tff7b72def Td2a8ffjobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72selfTff7b72.Td2a8ff_should_runTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffJOBS_INTERVALTb4b4b4)
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffannounce_interval Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8fflast_announce Tff7b72+ Tff7b72selfTff7b72.Td2a8ffannounce_intervalTb4b4b4: Tff7b72selfTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while running periodic jobs: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72def Td2a8ffget_announce_app_dataTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffnode_nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffannounceTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffAnnouncing page node destinationTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_announce Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffresolve_permissionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repository_nameTb4b4b4, Te6edf3permissionTb4b4b4)Tb4b4b4:
T8b949e# Since the nomadnet page protocol doesn't *require* authentication,
T8b949e# we use null_ident in case the remote hasn't identified.
Tff7b72if Tff7b72not Te6edf3remote_identityTb4b4b4: Te6edf3remote_identity Tff7b72= Tff7b72selfTff7b72.Td2a8ffnull_ident
Tff7b72return Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffresolve_permissionTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repository_nameTb4b4b4, Te6edf3permissionTb4b4b4)

Tff7b72def Td2a8ffregister_request_handlersTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_front_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_group_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_repo_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_tree_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_BLOBTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_blob_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_COMMITSTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_commits_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_COMMITTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_commit_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_REFSTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_refs_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_STATSTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_stats_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_RELEASESTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_releases_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_RELEASETb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_release_pageTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_ARTIFACTTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_artifactTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffregister_request_handlerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffPATH_DOWNLOADTb4b4b4, Te6edf3response_generatorTff7b72=Tff7b72selfTff7b72.Td2a8ffserve_downloadTb4b4b4, Te6edf3allowTff7b72=Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALLTb4b4b4)

Tff7b72def Td2a8ffget_templateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3templateTb4b4b4)Tb4b4b4:
Te6edf3filename Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3templateTffd700}Ta5d6ff.muTa5d6ff"
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8fftemplatesdirTb4b4b4, Te6edf3filenameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3osTff7b72.Td2a8ffaccessTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3osTff7b72.Td2a8ffX_OKTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Te6edf3pathTb4b4b4]Tb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Te6edf3template Tff7b72= Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffrstripTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3template

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not get dynamic template content from Tffd700{Te6edf3pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Tff7b72return Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffrstripTb4b4b4(Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not get static template content from Tffd700{Te6edf3pathTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffrender_templateTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Tff7b72NoneTb4b4b4, Te6edf3templateTff7b72=Tff7b72NoneTb4b4b4, Te6edf3stTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3custom_template Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_templateTb4b4b4(Te6edf3templateTb4b4b4) Tff7b72if Te6edf3template Tff7b72else Tff7b72None
Tff7b72if Te6edf3custom_templateTb4b4b4:
Te6edf3template Tff7b72= Te6edf3custom_template
Te6edf3page_content Tff7b72= Te6edf3templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{PAGE_CONTENT}Ta5d6ff"Tb4b4b4, Te6edf3page_contentTb4b4b4)

Tff7b72elif Te6edf3template Tff7b72and Te6edf3template Tff7b72in Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4:
Te6edf3template Tff7b72= Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Te6edf3templateTb4b4b4]
Te6edf3page_content Tff7b72= Te6edf3templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{PAGE_CONTENT}Ta5d6ff"Tb4b4b4, Te6edf3page_contentTb4b4b4)

Te6edf3base_template Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_templateTb4b4b4(Ta5d6ff"Ta5d6ffbaseTa5d6ff"Tb4b4b4) Tff7b72or Tff7b72selfTff7b72.Td2a8fftemplatesTb4b4b4[Ta5d6ff"Ta5d6ffbaseTa5d6ff"Tb4b4b4]
Te6edf3base_template Tff7b72= Te6edf3base_templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{PAGE_CONTENT}Ta5d6ff"Tb4b4b4, Te6edf3page_contentTb4b4b4)
Te6edf3base_template Tff7b72= Te6edf3base_templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{NODE_NAME}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffnode_nameTb4b4b4)
Te6edf3base_template Tff7b72= Te6edf3base_templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{VERSION}Ta5d6ff"Tb4b4b4, Te6edf3__version__Tb4b4b4)
Tff7b72if Te6edf3nav_contentTb4b4b4: Te6edf3base_template Tff7b72= Te6edf3base_templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{NAVIGATION}Ta5d6ff"Tb4b4b4, Te6edf3nav_contentTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3base_template Tff7b72= Te6edf3base_templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{NAVIGATION}Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)

Te6edf3gt Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffGenerated in Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Te6edf3stTb4b4b4)Tffd700}Ta5d6ff" Tff7b72if Te6edf3st Tff7b72else Ta5d6ff"Ta5d6ffUnknown generation timeTa5d6ff"
Te6edf3base_template Tff7b72= Te6edf3base_templateTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Tffd700{GEN_TIME}Ta5d6ff"Tb4b4b4, Te6edf3gtTb4b4b4)
Tff7b72return Te6edf3base_templateTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

T8b949e#############################
T8b949e# Micron Generation Helpers #
T8b949e#############################

Tff7b72def Td2a8ffm_headingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4, Te6edf3levelTff7b72=T79c0ff1Tb4b4b4)Tb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff>Ta5d6ff" Tff7b72* Te6edf3level Tff7b72+ Te6edf3text Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"
Tff7b72def Td2a8ffm_boldTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4: Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff`!Tffd700{Te6edf3textTffd700}Ta5d6ff`!Ta5d6ff"
Tff7b72def Td2a8ffm_italicTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4: Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff`*Tffd700{Te6edf3textTffd700}Ta5d6ff`*Ta5d6ff"
Tff7b72def Td2a8ffm_underlineTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4: Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff`_Tffd700{Te6edf3textTffd700}Ta5d6ff`_Ta5d6ff"
Tff7b72def Td2a8ffm_color_fgTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4, Te6edf3colorTb4b4b4)Tb4b4b4: Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff`FTffd700{Te6edf3colorTffd700}Tffd700{Te6edf3textTffd700}Ta5d6ff`fTa5d6ff"
Tff7b72def Td2a8ffm_dividerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3charTff7b72=Ta5d6ff"Tffea00\u2500Ta5d6ff"Tb4b4b4)Tb4b4b4: Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff-Tffd700{Te6edf3charTffd700}Tffea00\nTa5d6ff"
Tff7b72def Td2a8ffm_escapeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3textTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff`Ta5d6ff"Tb4b4b4, Ta5d6ff"Tffea00\\Ta5d6ff`Ta5d6ff"Tb4b4b4)

Tff7b72def Td2a8ffm_link_rTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3_labelTb4b4b4, Te6edf3_pathTb4b4b4, Tff7b72*Tff7b72*Te6edf3fieldsTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsanitize_vTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffquote_plusTb4b4b4(Tffa657strTb4b4b4(Te6edf3valueTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffsanitize_labelTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3valueTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff[Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff]Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff`Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3field_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3fieldsTb4b4b4:
Te6edf3field_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3fieldsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3field_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3kTffd700}Ta5d6ff=Tffd700{Te6edf3sanitize_vTb4b4b4(Te6edf3vTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3field_str Tff7b72= Ta5d6ff"Ta5d6ff`Ta5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff|Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3field_partsTb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff`[Tffd700{Te6edf3sanitize_labelTb4b4b4(Te6edf3_labelTb4b4b4)Tffd700}Ta5d6ff`:Tffd700{Te6edf3_pathTffd700}Tffd700{Te6edf3field_strTffd700}Ta5d6ff]Ta5d6ff"

Tff7b72def Td2a8ffm_linkTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3_labelTb4b4b4, Te6edf3_pathTb4b4b4, Tff7b72*Tff7b72*Te6edf3fieldsTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffsanitize_vTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffquote_plusTb4b4b4(Tffa657strTb4b4b4(Te6edf3valueTb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffsanitize_labelTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3valueTff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff[Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff]Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ff`Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3field_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3fieldsTb4b4b4:
Te6edf3field_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72in Te6edf3fieldsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3field_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3kTffd700}Ta5d6ff=Tffd700{Te6edf3sanitize_vTb4b4b4(Te6edf3vTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3field_str Tff7b72= Ta5d6ff"Ta5d6ff`Ta5d6ff" Tff7b72+ Ta5d6ff"Ta5d6ff|Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3field_partsTb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff`!`[Tffd700{Te6edf3sanitize_labelTb4b4b4(Te6edf3_labelTb4b4b4)Tffd700}Ta5d6ff`:Tffd700{Te6edf3_pathTffd700}Tffd700{Te6edf3field_strTffd700}Ta5d6ff]`!Ta5d6ff"

Tff7b72def Td2a8ffm_alignTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3textTb4b4b4, Te6edf3alignTff7b72=Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3align_tag Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4}Tff7b72.Td2a8ffgetTb4b4b4(Te6edf3alignTb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ff`Tffd700{Te6edf3align_tagTffd700}Tffd700{Te6edf3textTffd700}Ta5d6ff`aTa5d6ff"


T8b949e#########################
T8b949e# Page Serving Handlers #
T8b949e#########################

Tff7b72def Td2a8ffserve_front_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFront page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]

Te6edf3accessible_groups Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_groupsTb4b4b4(Te6edf3remote_identityTb4b4b4)

Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff>>Tffea00\nTffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff /Ta5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3accessible_groupsTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffNo repository groups available.Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3group_name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3accessible_groupsTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3group Tff7b72= Te6edf3accessible_groupsTb4b4b4[Te6edf3group_nameTb4b4b4]
Te6edf3repo_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3groupTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrepositoriesTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3repo_word Tff7b72= Ta5d6ff"Ta5d6ffrepositoryTa5d6ff" Tff7b72if Te6edf3repo_count Tff7b72== T79c0ff1 Tff7b72else Ta5d6ff"Ta5d6ffrepositoriesTa5d6ff"
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffmdcTff7b72.Td2a8ffBULLETTffd700}Ta5d6ff Tffd700{Te6edf3group_nameTffd700}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3linkTffd700}Ta5d6ff (Tffd700{Te6edf3repo_countTffd700}Ta5d6ff Tffd700{Te6edf3repo_wordTffd700}Ta5d6ff)Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Tff7b72NoneTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6fffrontTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_group_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffGroup page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"

Tff7b72if Tff7b72not Te6edf3group_nameTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffInvalid request.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3accessible_repos Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoriesTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Te6edf3group_name Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffgroups Tff7b72or Tff7b72not Te6edf3accessible_reposTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffGroup Not FoundTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffThe requested group was not found.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff>>Tffea00\nTffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Te6edf3group_nameTffd700}Ta5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3accessible_reposTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffNo repositories available.Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffRepositoriesTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3repo_name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3accessible_reposTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3repo Tff7b72= Te6edf3accessible_reposTb4b4b4[Te6edf3repo_nameTb4b4b4]
Te6edf3description Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_repository_descriptionTb4b4b4(Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffmdcTff7b72.Td2a8ffBULLETTffd700}Ta5d6ff Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3linkTffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3descriptionTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff - Tffd700{Te6edf3descriptionTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72NoneTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffgroupTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_repo_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRepository page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3ref Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ffHEADTa5d6ff"
Te6edf3thanks Tff7b72= Tff7b72True Tff7b72if Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_thanksTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72else Tff7b72False

Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Tff7b72not Te6edf3repo_nameTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffInvalid request.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)
Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]
T8b949e# Breadcrumb navigation
Te6edf3repo_url Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Ta5d6ffrns://Tffd700{Te6edf3RNSTff7b72.Td2a8ffhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4, Te6edf3delimitTff7b72=Tff7b72FalseTb4b4b4)Tffd700}Ta5d6ff/Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff`fTa5d6ff"
Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff>>Tffea00\nTffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff Tffd700{Te6edf3repo_urlTffd700}Ta5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)

Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffNot FoundTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffThe requested repository was not found.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)
Te6edf3description Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_repository_descriptionTb4b4b4(Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3descriptionTb4b4b4: Te6edf3description Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3descriptionTffd700}Tffea00\nTffea00\nTa5d6ff"
Tff7b72elseTb4b4b4: Te6edf3description Tff7b72= Ta5d6ff"Ta5d6ff"

Te6edf3thanks_count Tff7b72= Tff7b72selfTff7b72.Td2a8ffrepository_thanksTb4b4b4(Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3addTff7b72=Te6edf3thanksTb4b4b4, Te6edf3link_idTff7b72=Te6edf3link_idTb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3descriptionTffd700}Ta5d6ff"Tb4b4b4)

T8b949e# Get refs information
Te6edf3refs Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_repository_refsTb4b4b4(Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3resolved_ref Tff7b72= Tff7b72selfTff7b72.Td2a8ffresolve_refTb4b4b4(Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3refTb4b4b4)
Te6edf3commits_count Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_commit_countTb4b4b4(Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3resolved_refTb4b4b4) Tff7b72if Te6edf3resolved_ref Tff7b72else T79c0ff0
Te6edf3branch_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3refsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4) Tff7b72if Te6edf3refs Tff7b72else T79c0ff0
Te6edf3tag_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3refsTb4b4b4[Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Te6edf3refs Tff7b72else T79c0ff0
T8b949e# Get releases count
Te6edf3releases_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3repoTb4b4b4[Ta5d6ff'Ta5d6ffpathTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff.releasesTa5d6ff"
Te6edf3releases_count Tff7b72= T79c0ff0
Te6edf3releases Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffreleases_list_dataTb4b4b4(Te6edf3releases_pathTb4b4b4)
Tff7b72if Te6edf3releasesTb4b4b4: Te6edf3releases_count Tff7b72= Tffa657lenTb4b4b4(Tb4b4b4[Te6edf3r Tff7b72for Te6edf3r Tff7b72in Te6edf3releases Tff7b72if Te6edf3rTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffpublishedTa5d6ff"Tb4b4b4]Tb4b4b4)

Te6edf3sep Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffsepTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6fffolderTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff FilesTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Ta5d6ff'Ta5d6ffHEADTa5d6ff'Tb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3releases_countTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffpackageTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ff Releases (Tffd700{Te6edf3releases_countTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_RELEASESTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffcommitsTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ff Commits (Tffd700{Te6edf3commits_countTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_COMMITSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Ta5d6ff'Ta5d6ffHEADTa5d6ff'Tb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffbranchTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ff Branches (Tffd700{Te6edf3branch_countTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REFSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6fftagTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ff Tags (Tffd700{Te6edf3tag_countTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REFSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4)Tffd700}Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffheartTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ff Thanks (Tffd700{Te6edf3thanks_countTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3thanksTff7b72=Ta5d6ff"Ta5d6ffyTa5d6ff"Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffresolve_permissionTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffPERM_STATSTb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffstatsTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ff StatsTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_STATSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTffea00\nTa5d6ff<Ta5d6ff"Tb4b4b4)

T8b949e# Readme content
Te6edf3readme_contentTb4b4b4, Te6edf3readme_is_markdown Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_readme_contentTb4b4b4(Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3readme_content Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Tff7b72not Te6edf3readme_contentTff7b72.Td2a8fflstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff#Ta5d6ff"Tb4b4b4) Tff7b72and Tff7b72not Te6edf3readme_contentTff7b72.Td2a8fflstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff>Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_dividerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3readme_is_markdownTb4b4b4:
Te6edf3converted Tff7b72= Tff7b72selfTff7b72.Td2a8ffmdcTff7b72.Td2a8ffformat_blockTb4b4b4(Te6edf3readme_contentTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3convertedTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffd700{Te6edf3readme_contentTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_dividerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_italicTb4b4b4(Ta5d6ff"Ta5d6ffNo README file found in this repository.Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffrepoTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_tree_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTree page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3ref Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ffHEADTa5d6ff"
Te6edf3tree_path Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_pathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3tree_path Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffunquote_plusTb4b4b4(Te6edf3tree_pathTb4b4b4)
Te6edf3page_num Tff7b72= T79c0ff0
Tff7b72tryTb4b4b4:
Te6edf3page_str Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_pageTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff0Ta5d6ff"
Te6edf3page_num Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657intTb4b4b4(Te6edf3page_strTb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149ValueErrorTb4b4b4, Tf85149TypeErrorTb4b4b4)Tb4b4b4: Te6edf3page_num Tff7b72= T79c0ff0

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffNot FoundTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTffea00\nTa5d6ffThe requested repository does not exist or you do not have access to it.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo_path Tff7b72= Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]

T8b949e# Validate ref exists
Te6edf3resolved_ref Tff7b72= Tff7b72selfTff7b72.Td2a8ffresolve_refTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4)
Tff7b72if Tff7b72not Te6edf3resolved_refTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTffea00\nTa5d6ffThe ref Ta5d6ff'Tffd700{Te6edf3refTffd700}Ta5d6ff'Ta5d6ff does not exist in this repository.Tffea00\nTa5d6ff"
Te6edf3content Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff" Tff7b72+ Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffView All RefsTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REFSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Breadcrumb navigation
Te6edf3breadcrumb_parts Tff7b72= Tb4b4b4[ Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4) Tb4b4b4]

T8b949e# Add path components to breadcrumb
Tff7b72if Te6edf3tree_pathTb4b4b4:
Te6edf3path_components Tff7b72= Te6edf3tree_pathTff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Te6edf3current_path Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3iTb4b4b4, Te6edf3component Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3path_componentsTb4b4b4)Tb4b4b4:
Te6edf3current_path Tff7b72= Te6edf3current_path Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3component Tff7b72if Te6edf3current_path Tff7b72else Te6edf3component
Tff7b72if Te6edf3i Tff7b72== Tffa657lenTb4b4b4(Te6edf3path_componentsTb4b4b4) Tff7b72- T79c0ff1Tb4b4b4: Te6edf3breadcrumb_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3componentTb4b4b4) T8b949e# Last component not a link
Tff7b72elseTb4b4b4: Te6edf3breadcrumb_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3componentTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3current_pathTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3breadcrumb_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) T8b949e# Could be "root" or something, but a bit confusing

Te6edf3breadcrumb Tff7b72= Ta5d6ff"Ta5d6ff / Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3breadcrumb_partsTb4b4b4)
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff>>Tffea00\nTa5d6ff" Tff7b72+ Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Get tree entries
Te6edf3entries Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_tree_entriesTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3resolved_refTb4b4b4, Te6edf3tree_pathTb4b4b4)

Tff7b72if Te6edf3entries Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffError reading directory contents.Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elif Tff7b72not Te6edf3entriesTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffEmpty directory.Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3i_file Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6fffileTa5d6ff"Tb4b4b4)
Te6edf3i_folder Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6fffolderTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffsort_keyTb4b4b4(Te6edf3entryTb4b4b4)Tb4b4b4:
Te6edf3is_dir Tff7b72= Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72in Tb4b4b4(Ta5d6ff"Ta5d6fftreeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcommitTa5d6ff"Tb4b4b4) T8b949e# commit = submodule
Tff7b72return Tb4b4b4(Tff7b72not Te6edf3is_dirTb4b4b4, Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)

Te6edf3entriesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Te6edf3sort_keyTb4b4b4)

T8b949e# Pagination
Te6edf3total_entries Tff7b72= Tffa657lenTb4b4b4(Te6edf3entriesTb4b4b4)
Te6edf3start_idx Tff7b72= Te6edf3page_num Tff7b72* Tff7b72selfTff7b72.Td2a8ffTREE_ENTRIES_PER_PAGE
Te6edf3end_idx Tff7b72= Te6edf3start_idx Tff7b72+ Tff7b72selfTff7b72.Td2a8ffTREE_ENTRIES_PER_PAGE
Te6edf3page_entries Tff7b72= Te6edf3entriesTb4b4b4[Te6edf3start_idxTb4b4b4:Te6edf3end_idxTb4b4b4]

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffContents: Tffd700{Te6edf3refTffd700}Ta5d6ff (Tffd700{Te6edf3resolved_refTb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3total_entries Tff7b72> Tff7b72selfTff7b72.Td2a8ffTREE_ENTRIES_PER_PAGETb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Ta5d6ffShowing Tffd700{Te6edf3start_idx Tff7b72+ T79c0ff1Tffd700}Ta5d6ff-Tffd700{Tffa657minTb4b4b4(Te6edf3end_idxTb4b4b4, Te6edf3total_entriesTb4b4b4)Tffd700}Ta5d6ff of Tffd700{Te6edf3total_entriesTffd700}Ta5d6ff entries`fTffea00\nTffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Parent directory link (if not at root)
Tff7b72if Te6edf3tree_pathTb4b4b4:
Te6edf3parent_path Tff7b72= Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3tree_pathTff7b72.Td2a8ffrstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3ilink Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3i_folderTffd700}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3parent_pathTb4b4b4)
Te6edf3parent_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Ta5d6ff"Ta5d6ff ../Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3parent_pathTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_FOLDERTffd700}Tffd700{Te6edf3ilinkTffd700}Ta5d6ff`fTffd700{Te6edf3parent_linkTffd700}Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3entry Tff7b72in Te6edf3page_entriesTb4b4b4:
Te6edf3entry_name Tff7b72= Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3entry_type Tff7b72= Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4]
Te6edf3entry_mode Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)

T8b949e# Directory
Tff7b72if Te6edf3entry_type Tff7b72== Ta5d6ff"Ta5d6fftreeTa5d6ff"Tb4b4b4:
Te6edf3subpath Tff7b72= Te6edf3tree_path Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3entry_name Tff7b72if Te6edf3tree_path Tff7b72else Te6edf3entry_name
Te6edf3ilink Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3i_folderTffd700}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3subpathTb4b4b4)
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3entry_nameTffd700}Ta5d6ff/Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3subpathTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_FOLDERTffd700}Tffd700{Te6edf3ilinkTffd700}Ta5d6ff`fTffd700{Te6edf3linkTffd700}Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Submodule
Tff7b72elif Te6edf3entry_type Tff7b72== Ta5d6ff"Ta5d6ffcommitTa5d6ff"Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_FOLDERTffd700}Ta5d6ff⧉`f Tffd700{Te6edf3entry_nameTffd700}Ta5d6ff `F666(submodule)`fTffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Symlink
Tff7b72elif Te6edf3entry_type Tff7b72== Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4:
Te6edf3target Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fflink_targetTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_FILETffd700}Ta5d6ff↳`f Tffd700{Te6edf3entry_nameTffd700}Ta5d6ff `F666β†’ Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3targetTb4b4b4)Tffd700}Ta5d6ff`fTffea00\nTa5d6ff"Tb4b4b4)

T8b949e# File (blob)
Tff7b72elseTb4b4b4:
Te6edf3size_str Tff7b72= Tff7b72selfTff7b72.Td2a8ffformat_sizeTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4)
Te6edf3subpath Tff7b72= Te6edf3tree_path Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3entry_name Tff7b72if Te6edf3tree_path Tff7b72else Te6edf3entry_name
Te6edf3ilink Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3i_fileTffd700}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_BLOBTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3subpathTb4b4b4)
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3entry_nameTffd700}Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_BLOBTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3subpathTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_FILETffd700}Tffd700{Te6edf3ilinkTffd700}Ta5d6ff`fTffd700{Te6edf3linkTffd700}Ta5d6ff `F666(Tffd700{Te6edf3size_strTffd700}Ta5d6ff)`fTffea00\nTa5d6ff"Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Pagination controls
Tff7b72if Te6edf3total_entries Tff7b72> Tff7b72selfTff7b72.Td2a8ffTREE_ENTRIES_PER_PAGETb4b4b4:
Te6edf3nav_links Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3page_num Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3nav_linksTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffΒ« PreviousTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3tree_pathTb4b4b4, Te6edf3pageTff7b72=Te6edf3page_num Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4)

Te6edf3total_pages Tff7b72= Tb4b4b4(Te6edf3total_entries Tff7b72+ Tff7b72selfTff7b72.Td2a8ffTREE_ENTRIES_PER_PAGE Tff7b72- T79c0ff1Tb4b4b4) Tff7b72/Tff7b72/ Tff7b72selfTff7b72.Td2a8ffTREE_ENTRIES_PER_PAGE
Te6edf3nav_linksTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPage Tffd700{Te6edf3page_num Tff7b72+ T79c0ff1Tffd700}Ta5d6ff of Tffd700{Te6edf3total_pagesTffd700}Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3end_idx Tff7b72< Te6edf3total_entriesTb4b4b4:
Te6edf3nav_linksTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNext Β»Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3tree_pathTb4b4b4, Te6edf3pageTff7b72=Te6edf3page_num Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff | Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_linksTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3content_partsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72== Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4: Te6edf3content_partsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6ff"

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6fftreeTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_blob_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBlob page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3ref Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ffHEADTa5d6ff"
Te6edf3file_path Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_pathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3render Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_renderTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3raw Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rawTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3file_path Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffunquote_plusTb4b4b4(Te6edf3file_pathTb4b4b4)
Te6edf3render Tff7b72= Tff7b72True Tff7b72if Te6edf3render Tff7b72else Tff7b72False
Te6edf3raw Tff7b72= Tff7b72True Tff7b72if Te6edf3raw Tff7b72else Tff7b72False

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffNot FoundTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTffea00\nTa5d6ffThe requested repository does not exist or you do not have access to it.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo_path Tff7b72= Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]

T8b949e# Validate ref exists
Te6edf3resolved_ref Tff7b72= Tff7b72selfTff7b72.Td2a8ffresolve_refTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4)
Tff7b72if Tff7b72not Te6edf3resolved_refTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffRef Not FoundTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTffea00\nTa5d6ffThe ref Ta5d6ff'Tffd700{Te6edf3refTffd700}Ta5d6ff'Ta5d6ff does not exist in this repository.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

T8b949e# Validate file path
Tff7b72if Tff7b72not Te6edf3file_pathTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffInvalid PathTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTffea00\nTa5d6ffNo file path specified.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3file_ext Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffsplitextTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3renderable Tff7b72= Te6edf3file_ext Tff7b72in Tff7b72selfTff7b72.Td2a8ffRENDERABLE_EXTS
Tff7b72if Tff7b72not Te6edf3renderableTb4b4b4: Te6edf3raw Tff7b72= Tff7b72TrueTb4b4b4; Te6edf3render Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3rawTb4b4b4: Te6edf3render Tff7b72= Tff7b72False
Tff7b72elif Tff7b72not Te6edf3render Tff7b72and Te6edf3file_ext Tff7b72in Tff7b72selfTff7b72.Td2a8ffRENDER_DEFAULTTb4b4b4: Te6edf3render Tff7b72= Tff7b72TrueTb4b4b4; Te6edf3raw Tff7b72= Tff7b72False

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Breadcrumb navigation
Te6edf3breadcrumb_parts Tff7b72= Tb4b4b4[ Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4) Tb4b4b4]

T8b949e# Add path components
Te6edf3path_components Tff7b72= Te6edf3file_pathTff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Te6edf3current_path Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72for Te6edf3iTb4b4b4, Te6edf3component Tff7b72in Tffa657enumerateTb4b4b4(Te6edf3path_componentsTb4b4b4)Tb4b4b4:
Te6edf3current_path Tff7b72= Te6edf3current_path Tff7b72+ Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72+ Te6edf3component Tff7b72if Te6edf3current_path Tff7b72else Te6edf3component
Tff7b72if Te6edf3i Tff7b72== Tffa657lenTb4b4b4(Te6edf3path_componentsTb4b4b4) Tff7b72- T79c0ff1Tb4b4b4: Te6edf3breadcrumb_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3componentTb4b4b4) T8b949e# Last component (file) not a link
Tff7b72elseTb4b4b4: Te6edf3breadcrumb_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3componentTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3current_pathTb4b4b4)Tb4b4b4)

Te6edf3breadcrumb Tff7b72= Ta5d6ff"Ta5d6ff / Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3breadcrumb_partsTb4b4b4)
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff>>Tffea00\nTa5d6ff" Tff7b72+ Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3dl_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffDownloadTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_DOWNLOADTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3file_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3renderableTb4b4b4: Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffd700{Te6edf3dl_linkTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3sep Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffsepTa5d6ff"Tb4b4b4)
Te6edf3rnd_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffView renderedTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_BLOBTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3file_pathTb4b4b4, Te6edf3renderTff7b72=Ta5d6ff"Ta5d6ffyTa5d6ff"Tb4b4b4)
Te6edf3raw_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffView rawTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_BLOBTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3file_pathTb4b4b4, Te6edf3rawTff7b72=Ta5d6ff"Ta5d6ffyTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3renderTb4b4b4: Te6edf3render_controls Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffDisplaying Rendered Tffd700{Te6edf3sepTffd700}Ta5d6ff Tffd700{Te6edf3raw_linkTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4: Te6edf3render_controls Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ffDisplaying Raw Tffd700{Te6edf3sepTffd700}Ta5d6ff Tffd700{Te6edf3rnd_linkTffd700}Ta5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTffd700{Te6edf3render_controlsTffd700}Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Tffd700{Te6edf3dl_linkTffd700}Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Get blob info
Te6edf3blob_info Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_blob_infoTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3resolved_refTb4b4b4, Te6edf3file_pathTb4b4b4)

Tff7b72if Te6edf3blob_info Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffFile not found at this ref.Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3size Tff7b72= Te6edf3blob_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3is_binary Tff7b72= Te6edf3blob_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffis_binaryTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Te6edf3is_symlink Tff7b72= Te6edf3blob_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffis_symlinkTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Te6edf3symlink_target Tff7b72= Te6edf3blob_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsymlink_targetTa5d6ff"Tb4b4b4)

Te6edf3type_str Tff7b72= Ta5d6ff'Ta5d6ffBinaryTa5d6ff' Tff7b72if Te6edf3is_binary Tff7b72else Ta5d6ff'Ta5d6ffTextTa5d6ff'
Te6edf3size_str Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sizeTb4b4b4)
Te6edf3symlink_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff | Symlink β†’ Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3symlink_target Tff7b72or Ta5d6ff'Ta5d6ffunknownTa5d6ff'Tb4b4b4)Tffd700}Ta5d6ff" Tff7b72if Te6edf3is_symlink Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3file_pathTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIM_HTffd700}Tffd700{Te6edf3refTffd700}Ta5d6ff (Tffd700{Te6edf3resolved_refTb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tffd700}Ta5d6ff) Tffd700{Te6edf3type_strTffd700}Ta5d6ff, Tffd700{Te6edf3size_strTffd700}Tffd700{Te6edf3symlink_strTffd700}Ta5d6ff`fTffea00\nTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)

T8b949e# Content display
Tff7b72if Te6edf3is_symlinkTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`*Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3symlink_target Tff7b72or Ta5d6ff'Ta5d6ffunknownTa5d6ff'Tb4b4b4)Tffd700}Ta5d6ff`*Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72elif Te6edf3is_binaryTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffThis file appears to be binary and cannot be displayed as text.Tffea00\nTa5d6ff"Tb4b4b4)
T8b949e# TODO: Implement raw file downloads

Tff7b72elif Te6edf3size Tff7b72> Tff7b72selfTff7b72.Td2a8ffBLOB_SIZE_LIMITTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThis file is Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sizeTb4b4b4)Tffd700}Ta5d6ff, which exceeds the display limit of Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffBLOB_SIZE_LIMITTb4b4b4)Tffd700}Ta5d6ff.Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_blob_contentTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3resolved_refTb4b4b4, Te6edf3file_pathTb4b4b4)
Tff7b72if Te6edf3content Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72if Te6edf3renderable Tff7b72and Te6edf3renderTb4b4b4:
Tff7b72if Te6edf3file_ext Tff7b72== Ta5d6ff"Ta5d6ff.muTa5d6ff"Tb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3contentTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3file_ext Tff7b72== Ta5d6ff"Ta5d6ff.mdTa5d6ff"Tb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffmdcTff7b72.Td2a8ffformat_blockTb4b4b4(Te6edf3contentTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72else Tb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`=Tffea00\nTffd700{Te6edf3contentTffd700}Tffea00\nTa5d6ff`=Ta5d6ff"Tb4b4b4)

Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffhighlight_syntaxTb4b4b4:
Te6edf3highlighted Tff7b72= Tff7b72selfTff7b72.Td2a8ffhighlighterTff7b72.Td2a8ffhighlightTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3file_pathTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3highlightedTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`=Tffea00\nTffd700{Te6edf3contentTffd700}Tffea00\nTa5d6ff`=Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffError reading file content.Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffblobTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_commits_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCommits page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3ref Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ffHEADTa5d6ff"
Te6edf3file_path Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_pathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3file_path Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffunquote_plusTb4b4b4(Te6edf3file_pathTb4b4b4)
Te6edf3page_num Tff7b72= T79c0ff0
Tff7b72tryTb4b4b4:
Te6edf3page_str Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_pageTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff0Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff0Ta5d6ff"
Te6edf3page_num Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657intTb4b4b4(Te6edf3page_strTb4b4b4)Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149ValueErrorTb4b4b4, Tf85149TypeErrorTb4b4b4)Tb4b4b4: Te6edf3page_num Tff7b72= T79c0ff0

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffNot FoundTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTffea00\nTa5d6ffThe requested repository does not exist or you do not have access to it.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo_path Tff7b72= Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]

T8b949e# Validate ref exists
Te6edf3resolved_ref Tff7b72= Tff7b72selfTff7b72.Td2a8ffresolve_refTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4)
Tff7b72if Tff7b72not Te6edf3resolved_refTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffRef Not FoundTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTffea00\nTa5d6ffThe ref Ta5d6ff'Tffd700{Te6edf3refTffd700}Ta5d6ff'Ta5d6ff does not exist in this repository.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Breadcrumb navigation
Te6edf3breadcrumb_parts Tff7b72= Tb4b4b4[ Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffcommitsTa5d6ff" Tb4b4b4]

Tff7b72if Te6edf3file_pathTb4b4b4: Te6edf3breadcrumb_partsTff7b72.Td2a8ffinsertTb4b4b4(T79c0ff3Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3file_pathTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)

Te6edf3breadcrumb Tff7b72= Ta5d6ff"Ta5d6ff / Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3breadcrumb_partsTb4b4b4)
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff>>Tffea00\nTa5d6ff" Tff7b72+ Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3title_suffix Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff for Tffd700{Te6edf3file_pathTffd700}Ta5d6ff" Tff7b72if Te6edf3file_path Tff7b72else Ta5d6ff"Ta5d6ff"

T8b949e# Get commits
Te6edf3skip Tff7b72= Te6edf3page_num Tff7b72* Tff7b72selfTff7b72.Td2a8ffCOMMITS_PER_PAGE
Te6edf3commits Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_commitsTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3resolved_refTb4b4b4, Te6edf3file_pathTb4b4b4, Te6edf3skipTb4b4b4, Tff7b72selfTff7b72.Td2a8ffCOMMITS_PER_PAGETb4b4b4)

Tff7b72if Te6edf3commits Tff7b72is Tff7b72NoneTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffError reading commit history.Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elif Tff7b72not Te6edf3commitsTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffNo commits found.Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCommitsTffd700{Te6edf3title_suffixTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIM_HTffd700}Tffd700{Te6edf3refTffd700}Ta5d6ff (Tffd700{Te6edf3resolved_refTb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tffd700}Ta5d6ff)`fTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3commit Tff7b72in Te6edf3commitsTb4b4b4:
Te6edf3short_hash Tff7b72= Te6edf3commitTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff7Tb4b4b4]
Te6edf3subject Tff7b72= Te6edf3commitTb4b4b4[Ta5d6ff"Ta5d6ffsubjectTa5d6ff"Tb4b4b4]
Te6edf3author Tff7b72= Te6edf3commitTb4b4b4[Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4]
Te6edf3date Tff7b72= Tff7b72selfTff7b72.Td2a8ffformat_absolute_timeTb4b4b4(Te6edf3commitTb4b4b4[Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff - Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffformat_relative_timeTb4b4b4(Te6edf3commitTb4b4b4[Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4]Tb4b4b4)

Te6edf3hash_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3short_hashTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_COMMITTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3hTff7b72=Te6edf3commitTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F66dTffd700{Te6edf3hash_linkTffd700}Ta5d6ff`f Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3authorTb4b4b4)Tffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Tffd700{Te6edf3dateTffd700}Ta5d6ff`fTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3subjectTb4b4b4)Tffd700}Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Pagination controls
Te6edf3has_more Tff7b72= Tffa657lenTb4b4b4(Te6edf3commitsTb4b4b4) Tff7b72== Tff7b72selfTff7b72.Td2a8ffCOMMITS_PER_PAGE

Tff7b72if Te6edf3page_num Tff7b72> T79c0ff0 Tff7b72or Te6edf3has_moreTb4b4b4:
Te6edf3nav_links Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3page_num Tff7b72> T79c0ff0Tb4b4b4: Te6edf3nav_linksTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffΒ« NewerTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_COMMITSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3file_pathTb4b4b4, Te6edf3pageTff7b72=Te6edf3page_num Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3nav_linksTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPage Tffd700{Te6edf3page_num Tff7b72+ T79c0ff1Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3has_moreTb4b4b4: Te6edf3nav_linksTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffOlder Β»Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_COMMITSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3refTb4b4b4, Te6edf3pathTff7b72=Te6edf3file_pathTb4b4b4, Te6edf3pageTff7b72=Te6edf3page_num Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff | Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_linksTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffcommitsTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_commit_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCommit page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3commit_hash Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_hTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"

Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Tff7b72not Te6edf3repo_nameTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffInvalid request.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffThe requested repository was not found.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo_path Tff7b72= Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]

T8b949e# Validate commit hash
Tff7b72if Tff7b72not Te6edf3commit_hash Tff7b72or Tffa657lenTb4b4b4(Te6edf3commit_hashTb4b4b4) Tff7b72< T79c0ff7Tb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffNo valid commit hash specified.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

T8b949e# Resolve and validate the commit hash
Te6edf3resolved_hash Tff7b72= Tff7b72selfTff7b72.Td2a8ffresolve_refTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3commit_hashTb4b4b4)
Tff7b72if Tff7b72not Te6edf3resolved_hashTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffThe commit Tffd700{Te6edf3commit_hashTffd700}Ta5d6ff does not exist in this repository.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

T8b949e# Breadcrumb navigation
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Te6edf3resolved_hashTb4b4b4[Tb4b4b4:T79c0ff7Tb4b4b4]Tffd700}Ta5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff>>Tffea00\nTa5d6ff" Tff7b72+ Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)

T8b949e# Verify it's actually a commit object
Tff7b72tryTb4b4b4:
Te6edf3type_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Te6edf3resolved_hashTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3type_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0 Tff7b72or Te6edf3type_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72!= Ta5d6ff"Ta5d6ffcommitTa5d6ff"Tb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffThe hash Tffd700{Te6edf3commit_hashTffd700}Ta5d6ff does not refer to a commit.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffCould not verify commit object.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]

Te6edf3commit_info Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_commit_infoTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3resolved_hashTb4b4b4)
Tff7b72if Tff7b72not Te6edf3commit_infoTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTffea00\nTa5d6ffCould not retrieve commit information.Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCommit Tffd700{Te6edf3resolved_hashTffd700}Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Navigation to tree at this commit
Te6edf3i_folder Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6fffolderTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6fffTa5d6ff'Tffd700{Te6edf3i_folderTffd700}Ta5d6ff Browse tree at this commitTa5d6ff'Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3resolved_hashTb4b4b4)Tffd700}Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Commit metadata
Tff7b72if Te6edf3commit_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffparentsTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3parent_links Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3parent_hash Tff7b72in Te6edf3commit_infoTb4b4b4[Ta5d6ff"Ta5d6ffparentsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3parent_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3parent_hashTb4b4b4[Tb4b4b4:T79c0ff7Tb4b4b4]Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_COMMITTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3hTff7b72=Te6edf3parent_hashTb4b4b4)
Te6edf3parent_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3parent_linkTb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffParents: Tffd700{Ta5d6ff'Ta5d6ff Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3parent_linksTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAuthor: Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3commit_infoTb4b4b4[Ta5d6ff'Ta5d6ffauthor_nameTa5d6ff'Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff <Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3commit_infoTb4b4b4[Ta5d6ff'Ta5d6ffauthor_emailTa5d6ff'Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff>Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDate: Tffd700{Te6edf3commit_infoTb4b4b4[Ta5d6ff'Ta5d6ffauthor_dateTa5d6ff'Tb4b4b4]Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3commit_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcommitter_nameTa5d6ff"Tb4b4b4) Tff7b72!= Te6edf3commit_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffauthor_nameTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCommit: Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3commit_infoTb4b4b4[Ta5d6ff'Ta5d6ffcommitter_nameTa5d6ff'Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff <Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3commit_infoTb4b4b4[Ta5d6ff'Ta5d6ffcommitter_emailTa5d6ff'Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff>Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDate: Tffd700{Te6edf3commit_infoTb4b4b4[Ta5d6ff'Ta5d6ffcommitter_dateTa5d6ff'Tb4b4b4]Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Commit message
Tff7b72if Te6edf3commit_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3commit_infoTb4b4b4[Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Changed files
Tff7b72if Te6edf3commit_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffChangesTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3total_additions Tff7b72= Tffa657sumTb4b4b4(Te6edf3fTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffadditionsTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72for Te6edf3f Tff7b72in Te6edf3commit_infoTb4b4b4[Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3total_deletions Tff7b72= Tffa657sumTb4b4b4(Te6edf3fTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdeletionsTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4) Tff7b72for Te6edf3f Tff7b72in Te6edf3commit_infoTb4b4b4[Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4]Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Tffa657lenTb4b4b4(Te6edf3commit_infoTb4b4b4[Ta5d6ff'Ta5d6fffilesTa5d6ff'Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff files changed, Tffd700{Te6edf3total_additionsTffd700}Ta5d6ff insertions(+), Tffd700{Te6edf3total_deletionsTffd700}Ta5d6ff deletions(-)Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3file_info Tff7b72in Te6edf3commit_infoTb4b4b4[Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3status Tff7b72= Te6edf3file_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffMTa5d6ff"Tb4b4b4)
Te6edf3file_path Tff7b72= Te6edf3file_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4)
Te6edf3additions Tff7b72= Te6edf3file_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffadditionsTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3deletions Tff7b72= Te6edf3file_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdeletionsTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)

Te6edf3status_indicators Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffATa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff`F0a0A`fTa5d6ff"Tb4b4b4, T8b949e# Added - green
Ta5d6ff"Ta5d6ffDTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff`F900D`fTa5d6ff"Tb4b4b4, T8b949e# Deleted - red
Ta5d6ff"Ta5d6ffMTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff`Faa0M`fTa5d6ff"Tb4b4b4, T8b949e# Modified - yellow
Ta5d6ff"Ta5d6ffRTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff`F0aaR`fTa5d6ff" Tb4b4b4} T8b949e# Renamed - cyan
Te6edf3status_display Tff7b72= Te6edf3status_indicatorsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3statusTb4b4b4, Te6edf3statusTb4b4b4)

T8b949e# File path as link to blob at this commit
Te6edf3file_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_BLOBTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3resolved_hashTb4b4b4, Te6edf3pathTff7b72=Te6edf3file_pathTb4b4b4)

Te6edf3stats Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3additions Tff7b72> T79c0ff0Tb4b4b4: Te6edf3statsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F0a0+Tffd700{Te6edf3additionsTffd700}Ta5d6ff`fTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3deletions Tff7b72> T79c0ff0Tb4b4b4: Te6edf3statsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F900-Tffd700{Te6edf3deletionsTffd700}Ta5d6ff`fTa5d6ff"Tb4b4b4)

Te6edf3stats_str Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3statsTb4b4b4) Tff7b72if Te6edf3stats Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3status_displayTffd700}Ta5d6ff Tffd700{Te6edf3file_linkTffd700}Ta5d6ff Tffd700{Te6edf3stats_strTffd700}Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Tff7b72selfTff7b72.Td2a8ffSHOW_DIFF_BY_DEFAULT Tff7b72and Te6edf3commit_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffdiffTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffDiffTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3formatted_diff Tff7b72= Tff7b72selfTff7b72.Td2a8ffformat_diffTb4b4b4(Te6edf3commit_infoTb4b4b4[Ta5d6ff"Ta5d6ffdiffTa5d6ff"Tb4b4b4]Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3formatted_diffTff7b72.Td2a8fflstripTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffcommitTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_refs_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRefs page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3ref_type Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_typeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff" T8b949e# "heads", "tags", or empty for both

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Breadcrumb navigation
Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tffd700}Ta5d6ff / refsTa5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff>>Tffea00\nTa5d6ff" Tff7b72+ Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)

Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Tff7b72not Te6edf3repo_nameTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffInvalid request.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffThe requested repository was not found.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo_path Tff7b72= Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]

T8b949e# Filtering links
Te6edf3i_sep Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffsepTa5d6ff"Tb4b4b4)
Te6edf3filter_links Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3filter_linksTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffAllTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REFSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tb4b4b4)
Te6edf3filter_linksTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffBranches onlyTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REFSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3filter_linksTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffTags onlyTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REFSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Tffa657typeTff7b72=Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3i_sepTffd700}Ta5d6ff Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3filter_linksTb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Get default branch (HEAD)
Te6edf3default_branch Tff7b72= Tff7b72None
Tff7b72tryTb4b4b4:
Te6edf3head_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffsymbolic-refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3head_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Te6edf3default_branch Tff7b72= Te6edf3head_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffreplaceTb4b4b4(Ta5d6ff"Ta5d6ffrefs/heads/Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass

Te6edf3show_heads Tff7b72= Tff7b72not Te6edf3ref_type Tff7b72or Te6edf3ref_type Tff7b72== Ta5d6ff"Ta5d6ffheadsTa5d6ff"
Te6edf3show_tags Tff7b72= Tff7b72not Te6edf3ref_type Tff7b72or Te6edf3ref_type Tff7b72== Ta5d6ff"Ta5d6fftagsTa5d6ff"

Te6edf3refs_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_refs_infoTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3default_branchTb4b4b4)

Tff7b72if Te6edf3show_heads Tff7b72and Te6edf3refs_dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffBranches (Tffd700{Tffa657lenTb4b4b4(Te6edf3refs_dataTb4b4b4[Ta5d6ff'Ta5d6ffheadsTa5d6ff'Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3ref_info Tff7b72in Te6edf3refs_dataTb4b4b4[Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3branch_name Tff7b72= Te6edf3ref_infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3short_hash Tff7b72= Te6edf3ref_infoTb4b4b4[Ta5d6ff"Ta5d6ffshort_hashTa5d6ff"Tb4b4b4]
Te6edf3is_default Tff7b72= Te6edf3ref_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffis_defaultTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Te6edf3commit_subject Tff7b72= Te6edf3ref_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcommit_subjectTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)

T8b949e# Branch name with default indicator
Te6edf3name_display Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`F0a0Tffd700{Te6edf3branch_nameTffd700}Ta5d6ff`fTa5d6ff" Tff7b72if Te6edf3is_default Tff7b72else Te6edf3branch_name
Te6edf3default_marker Tff7b72= Ta5d6ff"Ta5d6ff `F0a0(default)`fTa5d6ff" Tff7b72if Te6edf3is_default Tff7b72else Ta5d6ff"Ta5d6ff"

T8b949e# Links to tree and commits at this branch
Te6edf3tree_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6fftreeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3branch_nameTb4b4b4)
Te6edf3commits_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffcommitsTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_COMMITSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3branch_nameTb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3name_displayTffd700}Tffd700{Te6edf3default_markerTffd700}Ta5d6ff [Tffd700{Te6edf3tree_linkTffd700}Ta5d6ff] [Tffd700{Te6edf3commits_linkTffd700}Ta5d6ff]Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3short_hashTffd700}Ta5d6ff: Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3commit_subjectTb4b4b4)Tffd700}Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3show_tags Tff7b72and Te6edf3refs_dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTags (Tffd700{Tffa657lenTb4b4b4(Te6edf3refs_dataTb4b4b4[Ta5d6ff'Ta5d6fftagsTa5d6ff'Tb4b4b4]Tb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3ref_info Tff7b72in Tffa657reversedTb4b4b4(Te6edf3refs_dataTb4b4b4[Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4:
Te6edf3tag_name Tff7b72= Te6edf3ref_infoTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3short_hash Tff7b72= Te6edf3ref_infoTb4b4b4[Ta5d6ff"Ta5d6ffshort_hashTa5d6ff"Tb4b4b4]
Te6edf3is_annotated Tff7b72= Te6edf3ref_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffis_annotatedTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)
Te6edf3tag_message Tff7b72= Te6edf3ref_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftag_messageTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3commit_subject Tff7b72= Te6edf3ref_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcommit_subjectTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)

T8b949e# Tag name with annotated indicator
Te6edf3annotated_marker Tff7b72= Ta5d6ff"Ta5d6ff `Faa0(annotated)`fTa5d6ff" Tff7b72if Te6edf3is_annotated Tff7b72else Ta5d6ff"Ta5d6ff"

T8b949e# Links to tree and commits at this tag
Te6edf3tree_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6fftreeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_TREETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3tag_nameTb4b4b4)
Te6edf3commits_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffcommitsTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_COMMITSTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3refTff7b72=Te6edf3tag_nameTb4b4b4)

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3tag_nameTffd700}Tffd700{Te6edf3annotated_markerTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Tffd700{Te6edf3short_hashTffd700}Ta5d6ff`f [Tffd700{Te6edf3tree_linkTffd700}Ta5d6ff] [Tffd700{Te6edf3commits_linkTffd700}Ta5d6ff]Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3is_annotated Tff7b72and Te6edf3tag_messageTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3tag_messageTb4b4b4[Tb4b4b4:T79c0ff512Tb4b4b4]Tb4b4b4)Tffd700}Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3commit_subjectTb4b4b4)Tffd700}Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)

T8b949e# No refs found
Tff7b72if Tb4b4b4(Te6edf3show_heads Tff7b72and Tff7b72not Te6edf3refs_dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72and Tb4b4b4(Te6edf3show_tags Tff7b72and Tff7b72not Te6edf3refs_dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffNo refs found in this repository.Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)Tff7b72.Td2a8ffrstripTb4b4b4(Tb4b4b4)Tff7b72+Ta5d6ff"Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffrefsTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_stats_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStatistics page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"

Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Tff7b72not Te6edf3repo_nameTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffInvalid request.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)
Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]
T8b949e# Breadcrumb navigation
Te6edf3repo_link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)
Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff>>Tffea00\nTffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Te6edf3repo_linkTffd700}Ta5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Te6edf3stats_permission Tff7b72= Tff7b72selfTff7b72.Td2a8ffresolve_permissionTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffPERM_STATSTb4b4b4)

Tff7b72if Tff7b72not Te6edf3repo Tff7b72or Tff7b72not Te6edf3stats_permissionTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffThe requested repository was not found.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)
Te6edf3stats Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffrepository_statsTb4b4b4(Te6edf3remote_identity Tff7b72or Tff7b72selfTff7b72.Td2a8ffnull_identTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3lookback_daysTff7b72=T79c0ff90Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3statsTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffStats UnavailableTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffCould not retrieve statistics for this repository.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3activity_colors Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffinactiveTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ff`F666Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffNo activityTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fflowTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ff`F66dTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLow activityTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmoderateTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ff`Faa0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffModerate activityTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffhighTa5d6ff"Tb4b4b4: Tb4b4b4(Ta5d6ff"Ta5d6ff`F0a0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHigh activityTa5d6ff"Tb4b4b4) Tb4b4b4}

Te6edf3act_colorTb4b4b4, Te6edf3act_label Tff7b72= Te6edf3activity_colorsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffactivity_levelTa5d6ff"Tb4b4b4]Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ff`F666Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffUnknownTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffStats for Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)

Te6edf3v_total Tff7b72= Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffviewsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftotalTa5d6ff"Tb4b4b4]
Te6edf3v_peak Tff7b72= Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffviewsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpeakTa5d6ff"Tb4b4b4]
Te6edf3f_total Tff7b72= Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fffetchesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftotalTa5d6ff"Tb4b4b4]
Te6edf3f_peak Tff7b72= Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fffetchesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpeakTa5d6ff"Tb4b4b4]
Te6edf3p_total Tff7b72= Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffpushesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftotalTa5d6ff"Tb4b4b4]
Te6edf3p_peak Tff7b72= Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffpushesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffpeakTa5d6ff"Tb4b4b4]

Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\nTa5d6ff`F66dViews`f : Tffd700{Te6edf3v_totalTffd700:Ta5d6ff>5Tffd700}Ta5d6ff total Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Ta5d6ff(peak: Tffd700{Te6edf3v_peakTffd700:Ta5d6ff>3Tffd700}Ta5d6ff)`fTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F0a0Fetches`f : Tffd700{Te6edf3f_totalTffd700:Ta5d6ff>5Tffd700}Ta5d6ff total Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Ta5d6ff(peak: Tffd700{Te6edf3f_peakTffd700:Ta5d6ff>3Tffd700}Ta5d6ff)Tffea00\nTa5d6ff`fTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`Faa0Pushes`f : Tffd700{Te6edf3p_totalTffd700:Ta5d6ff>5Tffd700}Ta5d6ff total Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Ta5d6ff(peak: Tffd700{Te6edf3p_peakTffd700:Ta5d6ff>3Tffd700}Ta5d6ff)Tffea00\nTa5d6ff`fTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F0aaActivity`f : Tffd700{Te6edf3statsTb4b4b4[Ta5d6ff'Ta5d6ffactivity_scoreTa5d6ff'Tb4b4b4]Tffd700:Ta5d6ff>5Tffd700}Ta5d6ff pointsTffea00\nTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3act_colorTffd700}Tffd700{Te6edf3act_labelTffd700}Ta5d6ff`f over the last Tffd700{Te6edf3statsTb4b4b4[Ta5d6ff'Ta5d6ffactual_daysTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff days (Tffd700{Te6edf3statsTb4b4b4[Ta5d6ff'Ta5d6ffdate_rangeTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff)Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3v_total Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffViewsTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrender_chartTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffviewsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdailyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftimeline_labelsTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3colorTff7b72=Ta5d6ff"Ta5d6ff66dTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3f_total Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFetchesTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrender_chartTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fffetchesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdailyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftimeline_labelsTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3colorTff7b72=Ta5d6ff"Ta5d6ff0a0Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3p_total Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPushesTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrender_chartTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffpushesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdailyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftimeline_labelsTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3colorTff7b72=Ta5d6ff"Ta5d6ffaa0Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffactivity_scoreTa5d6ff"Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffCombined ActivityTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrender_combined_chartTb4b4b4(Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffviewsTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdailyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fffetchesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdailyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6ffpushesTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffdailyTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3statsTb4b4b4[Ta5d6ff"Ta5d6fftimeline_labelsTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_italicTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffNo activity recorded for this repository in the selected time period.Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffstatsTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_releases_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReleases page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"

Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Tff7b72not Te6edf3repo_nameTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffInvalid request.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffThe requested repository was not found.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Breadcrumb navigation
Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff>>Tffea00\nTffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tffd700}Ta5d6ff / releasesTa5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)

Te6edf3releases_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3repoTb4b4b4[Ta5d6ff'Ta5d6ffpathTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff.releasesTa5d6ff"
Te6edf3releases Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffreleases_list_dataTb4b4b4(Te6edf3releases_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3releasesTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffReleasesTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffNo releases available for this repository.Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffrepoTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3published_releases Tff7b72= Tb4b4b4[Te6edf3r Tff7b72for Te6edf3r Tff7b72in Te6edf3releases Tff7b72if Te6edf3rTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffpublishedTa5d6ff"Tb4b4b4]
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffReleases (Tffd700{Tffa657lenTb4b4b4(Te6edf3published_releasesTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72for Te6edf3rel Tff7b72in Te6edf3published_releasesTb4b4b4:
Te6edf3tag Tff7b72= Te6edf3relTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftagTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4)
Te6edf3created_ts Tff7b72= Te6edf3relTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcreatedTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3date_str Tff7b72= Te6edf3timeTff7b72.Td2a8ffstrftimeTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff"Tb4b4b4, Te6edf3timeTff7b72.Td2a8fflocaltimeTb4b4b4(Te6edf3created_tsTb4b4b4)Tb4b4b4) Tff7b72if Te6edf3created_ts Tff7b72else Ta5d6ff"Ta5d6ffunknownTa5d6ff"
Te6edf3artifacts Tff7b72= Te6edf3relTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffartifactsTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3preview Tff7b72= Te6edf3relTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpreviewTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff256Tb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3relTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpreviewTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72> Tffa657lenTb4b4b4(Te6edf3previewTb4b4b4)Tb4b4b4: Te6edf3preview Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff…Ta5d6ff"
Te6edf3link Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3tagTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_RELEASETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3tTff7b72=Te6edf3tagTb4b4b4)
Te6edf3sep Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffsepTa5d6ff"Tb4b4b4)
Te6edf3artifacts_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`*Tffd700{Te6edf3artifactsTffd700}Ta5d6ff artifactTffd700{Ta5d6ff'Ta5d6ffsTa5d6ff' Tff7b72if Te6edf3artifacts Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff`*Ta5d6ff"
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3linkTffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Tffd700{Te6edf3date_strTffd700}Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Tffd700{Te6edf3artifacts_strTffd700}Ta5d6ff`fTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3previewTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3previewTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffreleasesTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_release_pageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRelease page request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3tag Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_tTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"

Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Tff7b72not Te6edf3repo_name Tff7b72or Tff7b72not Te6edf3tagTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffInvalid request.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffThe requested repository was not found.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3releases_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3repoTb4b4b4[Ta5d6ff'Ta5d6ffpathTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff.releasesTa5d6ff"
Tff7b72if Te6edf3tag Tff7b72== Ta5d6ff"Ta5d6fflatestTa5d6ff"Tb4b4b4:
Te6edf3releases Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffreleases_list_dataTb4b4b4(Te6edf3releases_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3releasesTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffRelease Not FoundTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffNo latest release exist.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3recent_releases Tff7b72= Tffa657sortedTb4b4b4(Te6edf3releasesTb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3xTb4b4b4: Te6edf3xTb4b4b4[Ta5d6ff'Ta5d6ffcreatedTa5d6ff'Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3tag Tff7b72= Te6edf3recent_releasesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftagTa5d6ff"Tb4b4b4]

Te6edf3content_parts Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3nav_parts Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Breadcrumb navigation
Te6edf3breadcrumb Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff>>Tffea00\nTffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff"Ta5d6ffNodeTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_INDEXTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3group_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_GROUPTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_REPOTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Tff7b72selfTff7b72.Td2a8ffm_linkTb4b4b4(Ta5d6ff'Ta5d6ffreleasesTa5d6ff'Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_RELEASESTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4)Tffd700}Ta5d6ff / Tffd700{Te6edf3tagTffd700}Ta5d6ff"
Te6edf3nav_partsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3breadcrumb Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3nav_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nav_partsTb4b4b4)

Te6edf3release_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3releases_pathTb4b4b4, Te6edf3tagTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3release_dirTb4b4b4)Tb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffRelease Not FoundTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffThe release Tffd700{Te6edf3tagTffd700}Ta5d6ff does not exist.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3release_info Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffrelease_dataTb4b4b4(Te6edf3release_dirTb4b4b4, Te6edf3tagTb4b4b4)
Tff7b72if Tff7b72not Te6edf3release_infoTb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffErrorTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ffCould not load release data.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

T8b949e# Only show published releases
Tff7b72if Te6edf3release_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4) Tff7b72!= Ta5d6ff"Ta5d6ffpublishedTa5d6ff"Tb4b4b4:
Te6edf3content Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffRelease Not FoundTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4) Tff7b72+ Ta5d6fffTa5d6ff"Tffea00\nTa5d6ffThe release Tffd700{Te6edf3tagTffd700}Ta5d6ff does not exist.Tffea00\nTa5d6ff"
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Te6edf3sep Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffsepTa5d6ff"Tb4b4b4)
Te6edf3heart Tff7b72= Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffheartTa5d6ff"Tb4b4b4)
Te6edf3created_ts Tff7b72= Te6edf3release_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffcreatedTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3ts_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff Tffd700{Te6edf3sepTffd700}Ta5d6ff Tffd700{Te6edf3timeTff7b72.Td2a8ffstrftimeTb4b4b4(Ta5d6ff'Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff'Tb4b4b4, Te6edf3timeTff7b72.Td2a8fflocaltimeTb4b4b4(Te6edf3created_tsTb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff" Tff7b72if Te6edf3created_ts Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRelease Tffd700{Te6edf3tagTffd700}Tffd700{Te6edf3ts_strTffd700}Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Release notes
Te6edf3notes Tff7b72= Te6edf3release_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnotesTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3notesTb4b4b4:
Te6edf3notes_format Tff7b72= Te6edf3release_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnotes_formatTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3notes_format Tff7b72== Ta5d6ff"Ta5d6ffmicronTa5d6ff"Tb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3notesTffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3notes_format Tff7b72== Ta5d6ff"Ta5d6ffmarkdownTa5d6ff"Tb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffmdcTff7b72.Td2a8ffformat_blockTb4b4b4(Te6edf3notesTb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`=Tffd700{Te6edf3notesTffd700}Ta5d6ff`=Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

T8b949e# Artifacts
Te6edf3artifacts Tff7b72= Te6edf3release_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffartifactsTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3artifactsTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffArtifacts (Tffd700{Tffa657lenTb4b4b4(Te6edf3artifactsTb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3art Tff7b72in Te6edf3artifactsTb4b4b4:
Te6edf3name Tff7b72= Te6edf3artTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffunknownTa5d6ff"Tb4b4b4)
Te6edf3size Tff7b72= Te6edf3artTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3size_str Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3sizeTb4b4b4) Tff7b72if Te6edf3size Tff7b72else Ta5d6ff"Ta5d6ff0 BTa5d6ff"
T8b949e# content_parts.append(f"{self.icon('file')} {self.m_escape(name)} {self.CLR_DIM}({size_str})`f\n")

Te6edf3lstr_1 Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff'Ta5d6fffileTa5d6ff'Tb4b4b4)Tffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3nameTb4b4b4)Tffd700}Ta5d6ff"
Te6edf3lstr_2 Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff(Tffd700{Te6edf3size_strTffd700}Ta5d6ff)Ta5d6ff"
Te6edf3link_1 Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Te6edf3lstr_1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_ARTIFACTTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3tTff7b72=Te6edf3tagTb4b4b4, Te6edf3aTff7b72=Te6edf3nameTb4b4b4)
Te6edf3link_2 Tff7b72= Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Te6edf3lstr_2Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_ARTIFACTTb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3tTff7b72=Te6edf3tagTb4b4b4, Te6edf3aTff7b72=Te6edf3nameTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3link_1Tffd700}Ta5d6ff Tffd700{Tff7b72selfTff7b72.Td2a8ffCLR_DIMTffd700}Tffd700{Te6edf3link_2Tffd700}Ta5d6ff`fTffea00\nTa5d6ff"Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72elseTb4b4b4:
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_headingTb4b4b4(Ta5d6ff"Ta5d6ffArtifactsTa5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ffNo artifacts for this release.Tffea00\nTffea00\nTa5d6ff"Tb4b4b4)

Te6edf3thanks Tff7b72= Tff7b72True Tff7b72if Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_thanksTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72else Tff7b72False
Te6edf3thanks_count Tff7b72= Tff7b72selfTff7b72.Td2a8ffrelease_thanksTb4b4b4(Te6edf3release_dirTb4b4b4, Te6edf3addTff7b72=Te6edf3thanksTb4b4b4, Te6edf3link_idTff7b72=Te6edf3link_idTb4b4b4)
Te6edf3content_partsTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8ffm_link_rTb4b4b4(Tff7b72selfTff7b72.Td2a8fficonTb4b4b4(Ta5d6ff"Ta5d6ffheartTa5d6ff"Tb4b4b4)Tff7b72+Ta5d6fffTa5d6ff"Ta5d6ff Thanks (Tffd700{Te6edf3thanks_countTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffPATH_RELEASETb4b4b4, Te6edf3gTff7b72=Te6edf3group_nameTb4b4b4, Te6edf3rTff7b72=Te6edf3repo_nameTb4b4b4, Te6edf3tTff7b72=Te6edf3tagTb4b4b4, Te6edf3thanksTff7b72=Ta5d6ff"Ta5d6ffyTa5d6ff"Tb4b4b4)Tffd700}Tffea00\nTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffview_succeededTb4b4b4(Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Te6edf3remote_identityTb4b4b4)
Te6edf3page_content Tff7b72= Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3content_partsTb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ffrender_templateTb4b4b4(Te6edf3page_contentTb4b4b4, Te6edf3nav_contentTff7b72=Te6edf3nav_contentTb4b4b4, Te6edf3templateTff7b72=Ta5d6ff"Ta5d6ffreleaseTa5d6ff"Tb4b4b4, Te6edf3stTff7b72=Te6edf3stTb4b4b4)

Tff7b72def Td2a8ffserve_artifactTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffArtifact file request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72if Tff7b72not Te6edf3dataTb4b4b4: Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3tag Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_tTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3artifact Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_aTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3artifact Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffunquote_plusTb4b4b4(Te6edf3artifactTb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ff/Ta5d6ff" Tff7b72in Te6edf3artifactTb4b4b4: Tff7b72return Tff7b72None

Tff7b72if Tff7b72not Te6edf3group_name Tff7b72or Tff7b72not Te6edf3repo_name Tff7b72or Tff7b72not Te6edf3tag Tff7b72or Tff7b72not Te6edf3artifactTb4b4b4: Tff7b72None

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRepository not found or no access for artifact request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3tagTffd700}Ta5d6ff/Tffd700{Te6edf3artifactTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Te6edf3releases_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3repoTb4b4b4[Ta5d6ff'Ta5d6ffpathTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff.releasesTa5d6ff"

Tff7b72if Te6edf3tag Tff7b72== Ta5d6ff"Ta5d6fflatestTa5d6ff"Tb4b4b4:
Te6edf3releases Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffreleases_list_dataTb4b4b4(Te6edf3releases_pathTb4b4b4)
Tff7b72if Tff7b72not Te6edf3releasesTb4b4b4: Tff7b72return Tff7b72None
Te6edf3recent_releases Tff7b72= Tffa657sortedTb4b4b4(Te6edf3releasesTb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3xTb4b4b4: Te6edf3xTb4b4b4[Ta5d6ff'Ta5d6ffcreatedTa5d6ff'Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3tag Tff7b72= Te6edf3recent_releasesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fftagTa5d6ff"Tb4b4b4]

Te6edf3release_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3releases_pathTb4b4b4, Te6edf3tagTb4b4b4)
Te6edf3artifacts_dir Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3release_dirTb4b4b4, Ta5d6ff"Ta5d6ffartifactsTa5d6ff"Tb4b4b4)
Te6edf3artifact_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3artifacts_dirTb4b4b4, Te6edf3artifactTb4b4b4)
Te6edf3release_info Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffrelease_dataTb4b4b4(Te6edf3release_dirTb4b4b4, Te6edf3tagTb4b4b4)
Tff7b72if Tff7b72not Te6edf3release_infoTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not resolve release info for artifact request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3tagTffd700}Ta5d6ff/Tffd700{Te6edf3artifactTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72if Te6edf3release_infoTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4) Tff7b72!= Ta5d6ff"Ta5d6ffpublishedTa5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffAttempt to fetch unpublished artifact Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3tagTffd700}Ta5d6ff/Tffd700{Te6edf3artifactTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3release_dirTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRelease directory not found for artifact request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3tagTffd700}Ta5d6ff/Tffd700{Te6edf3artifactTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3artifacts_dirTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffArtifacts directory not found for artifact request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3tagTffd700}Ta5d6ff/Tffd700{Te6edf3artifactTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3artifact_pathTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffArtifacts file not found for artifact request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3tagTffd700}Ta5d6ff/Tffd700{Te6edf3artifactTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffArtifact file resolved for artifact request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3tagTffd700}Ta5d6ff/Tffd700{Te6edf3artifactTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72return Tb4b4b4[Tffa657openTb4b4b4(Te6edf3artifact_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3artifactTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}Tb4b4b4]

Tff7b72def Td2a8ffserve_downloadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3pathTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3request_idTb4b4b4, Te6edf3link_idTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3requested_atTb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFile download request from Tffd700{Te6edf3remote_identityTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Te6edf3group_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_gTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3repo_name Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_rTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3ref Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHEADTa5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ffHEADTa5d6ff"
Te6edf3file_path Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffvar_pathTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3file_path Tff7b72= Te6edf3urllibTff7b72.Td2a8ffparseTff7b72.Td2a8ffunquote_plusTb4b4b4(Te6edf3file_pathTb4b4b4)
Te6edf3file_name Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3file_pathTb4b4b4)

Te6edf3repo Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoryTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)
Tff7b72if Tff7b72not Te6edf3repoTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRepository not found or no access for download request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3refTffd700}Ta5d6ff/Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Te6edf3repo_path Tff7b72= Te6edf3repoTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]

Te6edf3resolved_ref Tff7b72= Tff7b72selfTff7b72.Td2a8ffresolve_refTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4)
Tff7b72if Tff7b72not Te6edf3resolved_refTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRef not found for download request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3refTffd700}Ta5d6ff/Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72if Tff7b72not Te6edf3file_pathTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffNo file path for download request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3refTffd700}Ta5d6ff/Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Te6edf3blob_info Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_blob_infoTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3resolved_refTb4b4b4, Te6edf3file_pathTb4b4b4)
Tff7b72if Te6edf3blob_info Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFile not found at ref for download request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3refTffd700}Ta5d6ff/Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Te6edf3stream Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_blob_streamTb4b4b4(Te6edf3repo_pathTb4b4b4, Te6edf3resolved_refTb4b4b4, Te6edf3file_pathTb4b4b4)
Tff7b72if Te6edf3stream Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4: Tff7b72return Tb4b4b4[Te6edf3streamTb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3file_nameTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4}Tb4b4b4]
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not resolve blob stream for download request Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff/Tffd700{Te6edf3refTffd700}Ta5d6ff/Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72return Tff7b72None

T8b949e#######################
T8b949e# Git Data Extraction #
T8b949e#######################

Tff7b72def Td2a8ffget_repository_descriptionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# Try git config first
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffconfigTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--getTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrepository.descriptionTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0 Tff7b72and Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)

T8b949e# Fall back to description file
Te6edf3desc_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3repo_pathTffd700}Ta5d6ff.descriptionTa5d6ff"
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3desc_pathTb4b4b4)Tb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3desc_pathTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3desc Tff7b72= Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3descTb4b4b4: Tff7b72return Te6edf3desc

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting repository description: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_repository_refsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4)Tb4b4b4:
Te6edf3refs Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4}
Tff7b72tryTb4b4b4:
T8b949e# Get all refs with their hashes
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffor-each-refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--formatTa5d6ff"Tb4b4b4, Ta5d6ff"Tffd700%(objectname) %Ta5d6ff(refname) Ta5d6ff%Ta5d6ff(refname:short)Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrefs/headsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrefs/tagsTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72return Te6edf3refs

Tff7b72for Te6edf3line Tff7b72in Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue
Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, T79c0ff2Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Te6edf3full_hash Tff7b72= Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3ref_name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3short_name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72> T79c0ff2 Tff7b72else Te6edf3ref_name
Te6edf3short_hash Tff7b72= Te6edf3full_hashTb4b4b4[Tb4b4b4:T79c0ff7Tb4b4b4]
Te6edf3ref_info Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3short_nameTb4b4b4,
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3full_hashTb4b4b4,
Ta5d6ff"Ta5d6ffshort_hashTa5d6ff"Tb4b4b4: Te6edf3short_hash Tb4b4b4}
Tff7b72if Te6edf3ref_nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffrefs/heads/Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3refsTb4b4b4[Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3ref_infoTb4b4b4)
Tff7b72elif Te6edf3ref_nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffrefs/tags/Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3refsTb4b4b4[Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3ref_infoTb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting repository refs: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72return Te6edf3refs

Tff7b72def Td2a8ffresolve_refTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrev-parseTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--verifyTa5d6ff"Tb4b4b4, Te6edf3refTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3hash_val Tff7b72= Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
T8b949e# Validate it's a 40-char hex string
Tff7b72if Tffa657lenTb4b4b4(Te6edf3hash_valTb4b4b4) Tff7b72== T79c0ff40 Tff7b72and Tffa657allTb4b4b4(Te6edf3c Tff7b72in Ta5d6ff"Ta5d6ff0123456789abcdefTa5d6ff" Tff7b72for Te6edf3c Tff7b72in Te6edf3hash_valTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4: Tff7b72return Te6edf3hash_valTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout resolving ref Ta5d6ff'Tffd700{Te6edf3refTffd700}Ta5d6ff'Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError resolving ref: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_tree_entriesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3entries Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3tree_path Tff7b72= Te6edf3pathTff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3path Tff7b72else Ta5d6ff"Ta5d6ff"

Tff7b72tryTb4b4b4:
T8b949e# Use git ls-tree to list directory contents
Te6edf3ls_tree_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3tree_pathTffd700}Ta5d6ff" Tff7b72if Te6edf3tree_path Tff7b72else Te6edf3ref
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffls-treeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-lTa5d6ff"Tb4b4b4, Te6edf3ls_tree_pathTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4:
T8b949e# Check if it's actually a tree
Te6edf3cat_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4, Te6edf3ls_tree_pathTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3cat_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0 Tff7b72or Te6edf3cat_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72!= Ta5d6ff"Ta5d6fftreeTa5d6ff"Tb4b4b4: Tff7b72return Tff7b72None T8b949e# Not a valid tree
Tff7b72return Tb4b4b4[Tb4b4b4] T8b949e# Valid but empty tree

Tff7b72for Te6edf3line Tff7b72in Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue

T8b949e# Parse ls-tree output: <mode> <type> <sha> <size>\t<name>
T8b949e# Format: 100644 blob abc123 1234\tfilename
Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\tTa5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72!= T79c0ff2Tb4b4b4: Tff7b72continue

Te6edf3meta_part Tff7b72= Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]

Te6edf3meta_parts Tff7b72= Te6edf3meta_partTff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3meta_partsTb4b4b4) Tff7b72< T79c0ff3Tb4b4b4: Tff7b72continue

Te6edf3mode Tff7b72= Te6edf3meta_partsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3obj_type Tff7b72= Te6edf3meta_partsTb4b4b4[T79c0ff1Tb4b4b4]
T8b949e# sha = meta_parts[2]
Te6edf3size Tff7b72= T79c0ff0
Tff7b72if Tffa657lenTb4b4b4(Te6edf3meta_partsTb4b4b4) Tff7b72>Tff7b72= T79c0ff4Tb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3size Tff7b72= Tffa657intTb4b4b4(Te6edf3meta_partsTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)
Tff7b72except Tf85149ValueErrorTb4b4b4: Te6edf3size Tff7b72= T79c0ff0

Te6edf3entry Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Te6edf3obj_typeTb4b4b4, T8b949e# blob, tree, or commit
Ta5d6ff"Ta5d6ffmodeTa5d6ff"Tb4b4b4: Te6edf3modeTb4b4b4,
Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: Te6edf3sizeTb4b4b4,
Ta5d6ff"Ta5d6fflink_targetTa5d6ff"Tb4b4b4: Tff7b72None Tb4b4b4}

T8b949e# Detect symlinks (mode 120000) and get symlink target
Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ff120000Ta5d6ff"Tb4b4b4:
Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4] Tff7b72= Ta5d6ff"Ta5d6fflinkTa5d6ff"
Tff7b72tryTb4b4b4:
Te6edf3symlink_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3tree_pathTffd700}Ta5d6ff/Tffd700{Te6edf3nameTffd700}Ta5d6ff" Tff7b72if Te6edf3tree_path Tff7b72else Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3nameTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3symlink_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fflink_targetTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3symlink_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass

Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)

Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout listing tree contentsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting tree entries: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72return Te6edf3entries

Tff7b72def Td2a8ffget_blob_infoTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3file_path Tff7b72= Te6edf3pathTff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)

Tff7b72tryTb4b4b4:
T8b949e# Get object info
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-sTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72return Tff7b72None

Te6edf3size Tff7b72= Tffa657intTb4b4b4(Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e# Check if it's a symlink via ls-tree
Te6edf3parent_dir Tff7b72= Ta5d6ff"Ta5d6ff/Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3file_pathTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4[Tb4b4b4:Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3filename Tff7b72= Te6edf3file_pathTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]

Te6edf3ls_tree_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3parent_dirTffd700}Ta5d6ff" Tff7b72if Te6edf3parent_dir Tff7b72else Te6edf3ref
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffls-treeTa5d6ff"Tb4b4b4, Te6edf3ls_tree_pathTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Te6edf3is_symlink Tff7b72= Tff7b72False
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72for Te6edf3line Tff7b72in Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6fffTa5d6ff"Tffea00\tTffd700{Te6edf3filenameTffd700}Ta5d6ff" Tff7b72in Te6edf3line Tff7b72and Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff120000Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3is_symlink Tff7b72= Tff7b72True
Tff7b72break

T8b949e# Get symlink target if applicable
Te6edf3symlink_target Tff7b72= Tff7b72None
Tff7b72if Te6edf3is_symlinkTb4b4b4:
Te6edf3content_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3content_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Te6edf3symlink_target Tff7b72= Te6edf3content_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)

T8b949e# Binary detection using git diff --numstat
Te6edf3is_binary Tff7b72= Tff7b72False
Tff7b72if Tff7b72not Te6edf3is_symlinkTb4b4b4:
T8b949e# Try to get a sample of the file to check for null bytes
Te6edf3sample_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3sample_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# Check for null bytes in first 8KB
Te6edf3sample Tff7b72= Te6edf3sample_resultTff7b72.Td2a8ffstdoutTb4b4b4[Tb4b4b4:T79c0ff8192Tb4b4b4]
Tff7b72if Ta5d6ffbTa5d6ff'Tffea00\x00Ta5d6ff' Tff7b72in Te6edf3sampleTb4b4b4: Te6edf3is_binary Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
T8b949e# Also check using git diff approach for text encoding issues
Te6edf3diff_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdiffTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--numstatTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--no-indexTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/dev/nullTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

T8b949e# If git says it's binary, the line will start with "-" "-"
Tff7b72if Te6edf3diff_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff1Tb4b4b4: T8b949e# git diff returns 1 for differences
Te6edf3first_line Tff7b72= Te6edf3diff_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72if Te6edf3diff_resultTff7b72.Td2a8ffstdout Tff7b72else Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3first_lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3is_binary Tff7b72= Tff7b72True

Tff7b72return Tb4b4b4{ Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4: Te6edf3sizeTb4b4b4,
Ta5d6ff"Ta5d6ffis_binaryTa5d6ff"Tb4b4b4: Te6edf3is_binaryTb4b4b4,
Ta5d6ff"Ta5d6ffis_symlinkTa5d6ff"Tb4b4b4: Te6edf3is_symlinkTb4b4b4,
Ta5d6ff"Ta5d6ffsymlink_targetTa5d6ff"Tb4b4b4: Te6edf3symlink_target Tb4b4b4}

Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout getting blob infoTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting blob info: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_blob_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3file_path Tff7b72= Te6edf3pathTff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Tff7b72return Te6edf3resultTff7b72.Td2a8ffstdout

Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout getting blob contentTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting blob content: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)

Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_blob_streamTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4, Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3file_path Tff7b72= Te6edf3pathTff7b72.Td2a8ffstripTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3proc Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffPopenTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3refTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3stdoutTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4, Te6edf3stderrTff7b72=Te6edf3subprocessTff7b72.Td2a8ffPIPETb4b4b4)
Tff7b72return Te6edf3procTff7b72.Td2a8ffstdout
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout getting blob content handleTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting blob content handle: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_refs_infoTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3default_branchTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3refs Tff7b72= Tb4b4b4{Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4}

Tff7b72tryTb4b4b4:
T8b949e# Get all refs with their hashes and commit info
T8b949e# Format: objectname refname refname:short subject
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffor-each-refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--format=Ta5d6ff%Ta5d6ff(objectname)|Ta5d6ff%Ta5d6ff(refname)|Ta5d6ff%Ta5d6ff(refname:short)|Ta5d6ff%Ta5d6ff(subject)Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrefs/headsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrefs/tagsTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72return Te6edf3refs

Tff7b72for Te6edf3line Tff7b72in Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue

Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff|Ta5d6ff"Tb4b4b4, T79c0ff3Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72< T79c0ff3Tb4b4b4: Tff7b72continue

Te6edf3full_hash Tff7b72= Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3ref_name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3short_name Tff7b72= Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3subject Tff7b72= Te6edf3partsTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72> T79c0ff3 Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3short_hash Tff7b72= Te6edf3full_hashTb4b4b4[Tb4b4b4:T79c0ff7Tb4b4b4]

Te6edf3ref_info Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3short_nameTb4b4b4,
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3full_hashTb4b4b4,
Ta5d6ff"Ta5d6ffshort_hashTa5d6ff"Tb4b4b4: Te6edf3short_hashTb4b4b4,
Ta5d6ff"Ta5d6ffcommit_subjectTa5d6ff"Tb4b4b4: Te6edf3subjectTb4b4b4,
Ta5d6ff"Ta5d6ffis_defaultTa5d6ff"Tb4b4b4: Te6edf3short_name Tff7b72== Te6edf3default_branchTb4b4b4,
Ta5d6ff"Ta5d6ffis_annotatedTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fftag_messageTa5d6ff"Tb4b4b4: Tff7b72None Tb4b4b4}

Tff7b72if Te6edf3ref_nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffrefs/heads/Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3refsTb4b4b4[Ta5d6ff"Ta5d6ffheadsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3ref_infoTb4b4b4)

Tff7b72elif Te6edf3ref_nameTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffrefs/tags/Ta5d6ff"Tb4b4b4)Tb4b4b4:
T8b949e# Check if it's an annotated tag
Tff7b72tryTb4b4b4:
T8b949e# Get the object type this tag points to
Te6edf3tag_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fffor-each-refTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--format=Ta5d6ff%Ta5d6ff(objecttype)|Ta5d6ff%Ta5d6ff(contents:subject)Ta5d6ff"Tb4b4b4, Te6edf3ref_nameTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3tag_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3tag_parts Tff7b72= Te6edf3tag_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff|Ta5d6ff"Tb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3tag_partsTb4b4b4) Tff7b72>Tff7b72= T79c0ff2Tb4b4b4:
Te6edf3obj_type Tff7b72= Te6edf3tag_partsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3obj_type Tff7b72== Ta5d6ff"Ta5d6fftagTa5d6ff"Tb4b4b4:
Te6edf3ref_infoTb4b4b4[Ta5d6ff"Ta5d6ffis_annotatedTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72True
Te6edf3ref_infoTb4b4b4[Ta5d6ff"Ta5d6fftag_messageTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3tag_partsTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72pass

Te6edf3refsTb4b4b4[Ta5d6ff"Ta5d6fftagsTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Te6edf3ref_infoTb4b4b4)

Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout getting refs infoTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting refs info: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)

Tff7b72return Te6edf3refs

Tff7b72def Td2a8ffget_commit_countTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffrev-listTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--countTa5d6ff"Tb4b4b4, Te6edf3refTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Tff7b72return Tffa657intTb4b4b4(Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout counting commits for ref Ta5d6ff'Tffd700{Te6edf3refTffd700}Ta5d6ff'Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError counting commits: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return T79c0ff0

Tff7b72def Td2a8ffget_commitsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3refTb4b4b4, Te6edf3file_pathTb4b4b4, Te6edf3skipTb4b4b4, Te6edf3limitTb4b4b4)Tb4b4b4:
Te6edf3commits Tff7b72= Tb4b4b4[Tb4b4b4]

Tff7b72tryTb4b4b4:
Te6edf3sep Tff7b72= Ta5d6ff"Ta5d6ff|_SEP_|Ta5d6ff"
Te6edf3cmd Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflogTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ff--format=%HTffd700{Te6edf3sepTffd700}Ta5d6ff%sTffd700{Te6edf3sepTffd700}Ta5d6ff%anTffd700{Te6edf3sepTffd700}Ta5d6ff%aeTffd700{Te6edf3sepTffd700}Ta5d6ff%atTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--skipTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3skipTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff-nTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3limitTb4b4b4)Tb4b4b4, Te6edf3refTb4b4b4]
Tff7b72if Te6edf3file_pathTb4b4b4: Te6edf3cmdTff7b72.Td2a8ffextendTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff--Ta5d6ff"Tb4b4b4, Te6edf3file_pathTb4b4b4]Tb4b4b4)

Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Te6edf3cmdTb4b4b4, Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72return Tff7b72None

Tff7b72for Te6edf3line Tff7b72in Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue

Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3sepTb4b4b4, T79c0ff4Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72>Tff7b72= T79c0ff5Tb4b4b4:
Te6edf3commitsTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4{ Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffsubjectTa5d6ff"Tb4b4b4: Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffauthorTa5d6ff"Tb4b4b4: Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffauthor_emailTa5d6ff"Tb4b4b4: Te6edf3partsTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6fftimestampTa5d6ff"Tb4b4b4: Tffa657intTb4b4b4(Te6edf3partsTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4) Tb4b4b4}Tb4b4b4)

Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout getting commitsTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting commits: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72return Te6edf3commits

Tff7b72def Td2a8ffget_commit_infoTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3commit_hashTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
T8b949e# Get commit metadata
Te6edf3format_str Tff7b72= Ta5d6ff"Ta5d6ff%Ta5d6ffPTa5d6ff%Ta5d6ffnTffd700%aTa5d6ffnTa5d6ff%Ta5d6ffnTffd700%aTa5d6ffeTa5d6ff%Ta5d6ffnTffd700%aTa5d6ffITa5d6ff%Ta5d6ffnTffd700%cTa5d6ffnTa5d6ff%Ta5d6ffnTffd700%cTa5d6ffeTa5d6ff%Ta5d6ffnTffd700%cTa5d6ffITa5d6ff%Ta5d6ffnTa5d6ff%Ta5d6ffBTa5d6ff"
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--no-patchTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--format=Ta5d6ff" Tff7b72+ Te6edf3format_strTb4b4b4, Te6edf3commit_hashTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Tff7b72return Tff7b72None

Te6edf3lines Tff7b72= Te6edf3resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4) Tff7b72< T79c0ff7Tb4b4b4: Tff7b72return Tff7b72None

T8b949e# Parse parents (space-separated hashes on first line)
Te6edf3parents Tff7b72= Te6edf3linesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3linesTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72else Tb4b4b4[Tb4b4b4]

Te6edf3info Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffparentsTa5d6ff"Tb4b4b4: Te6edf3parentsTb4b4b4,
Ta5d6ff"Ta5d6ffauthor_nameTa5d6ff"Tb4b4b4: Te6edf3linesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffauthor_emailTa5d6ff"Tb4b4b4: Te6edf3linesTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffauthor_dateTa5d6ff"Tb4b4b4: Te6edf3linesTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffcommitter_nameTa5d6ff"Tb4b4b4: Te6edf3linesTb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffcommitter_emailTa5d6ff"Tb4b4b4: Te6edf3linesTb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffcommitter_dateTa5d6ff"Tb4b4b4: Te6edf3linesTb4b4b4[T79c0ff6Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmessageTa5d6ff"Tb4b4b4: Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4[T79c0ff7Tb4b4b4:Tb4b4b4]Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffdiffTa5d6ff"Tb4b4b4: Tff7b72None Tb4b4b4}

T8b949e# Get file change statistics
Te6edf3stats_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdiff-treeTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--numstatTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-rTa5d6ff"Tb4b4b4, Te6edf3commit_hashTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3stats_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72for Te6edf3line Tff7b72in Te6edf3stats_resultTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3lineTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72continue

T8b949e# Parse numstat output: <additions>\t<deletions>\t<path>
Te6edf3parts Tff7b72= Te6edf3lineTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\tTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tff7b72>Tff7b72= T79c0ff3Tb4b4b4:
Te6edf3additions Tff7b72= Te6edf3partsTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3deletions Tff7b72= Te6edf3partsTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3file_path Tff7b72= Te6edf3partsTb4b4b4[T79c0ff2Tb4b4b4]

T8b949e# Detect status based on additions/deletions pattern
Te6edf3status Tff7b72= Ta5d6ff"Ta5d6ffMTa5d6ff" T8b949e# Modified by default
Tff7b72if Te6edf3additions Tff7b72== Ta5d6ff"Ta5d6ff-Ta5d6ff" Tff7b72and Te6edf3deletions Tff7b72== Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4:
Te6edf3status Tff7b72= Ta5d6ff"Ta5d6ffRTa5d6ff" T8b949e# Renamed (binary or unmerged)
Te6edf3additions Tff7b72= Ta5d6ff"Ta5d6ff0Ta5d6ff"
Te6edf3deletions Tff7b72= Ta5d6ff"Ta5d6ff0Ta5d6ff"

T8b949e# Check for added/deleted via --diff-filter would require second call
T8b949e# Instead, we'll use a simpler approach: check if file exists in parent
Tff7b72if Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffparentsTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3parent Tff7b72= Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffparentsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
T8b949e# Check if file exists in parent
Te6edf3check_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-eTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3parentTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)

Tff7b72if Te6edf3check_resultTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Te6edf3status Tff7b72= Ta5d6ff"Ta5d6ffATa5d6ff" T8b949e# Added (didn't exist in parent)
Tff7b72elseTb4b4b4:
T8b949e# Check if file exists in current commit
Te6edf3check_current Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcat-fileTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff-eTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Tffd700{Te6edf3commit_hashTffd700}Ta5d6ff:Tffd700{Te6edf3file_pathTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3check_currentTff7b72.Td2a8ffreturncode Tff7b72!= T79c0ff0Tb4b4b4: Te6edf3status Tff7b72= Ta5d6ff"Ta5d6ffDTa5d6ff" T8b949e# Deleted (doesn't exist in current)

Tff7b72tryTb4b4b4:
Te6edf3add_count Tff7b72= Tffa657intTb4b4b4(Te6edf3additionsTb4b4b4) Tff7b72if Te6edf3additions Tff7b72!= Ta5d6ff"Ta5d6ff-Ta5d6ff" Tff7b72else T79c0ff0
Te6edf3del_count Tff7b72= Tffa657intTb4b4b4(Te6edf3deletionsTb4b4b4) Tff7b72if Te6edf3deletions Tff7b72!= Ta5d6ff"Ta5d6ff-Ta5d6ff" Tff7b72else T79c0ff0
Tff7b72except Tf85149ValueErrorTb4b4b4:
Te6edf3add_count Tff7b72= T79c0ff0
Te6edf3del_count Tff7b72= T79c0ff0

Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6fffilesTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4{ Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3file_pathTb4b4b4,
Ta5d6ff"Ta5d6ffstatusTa5d6ff"Tb4b4b4: Te6edf3statusTb4b4b4,
Ta5d6ff"Ta5d6ffadditionsTa5d6ff"Tb4b4b4: Te6edf3add_countTb4b4b4,
Ta5d6ff"Ta5d6ffdeletionsTa5d6ff"Tb4b4b4: Te6edf3del_count Tb4b4b4}Tb4b4b4)

T8b949e# Get diff if enabled
Tff7b72if Tff7b72selfTff7b72.Td2a8ffSHOW_DIFF_BY_DEFAULTTb4b4b4:
Te6edf3diff_result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--format=Ta5d6ff"Tb4b4b4, Te6edf3commit_hashTb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3timeoutTff7b72=Tff7b72selfTff7b72.Td2a8ffGIT_COMMAND_TIMEOUTTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3diff_resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdiffTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3diff_resultTff7b72.Td2a8ffstdout

Tff7b72return Te6edf3info

Tff7b72except Te6edf3subprocessTff7b72.Td2a8ffTimeoutExpiredTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTimeout getting commit infoTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError getting commit info: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72return Tff7b72None

Tff7b72def Td2a8ffget_readme_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4)Tb4b4b4:
Te6edf3readme_names Tff7b72= Tb4b4b4[ Tb4b4b4(Ta5d6ff"Ta5d6ffREADME.muTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffReadme.muTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffreadme.muTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffREADMETa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffreadmeTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffREADME.mdTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffreadme.mdTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffREADME.rstTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffREADME.txtTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffreadme.rstTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4, Tb4b4b4(Ta5d6ff"Ta5d6ffreadme.txtTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4) Tb4b4b4]
Tff7b72for Te6edf3readme_nameTb4b4b4, Te6edf3is_markdown Tff7b72in Te6edf3readme_namesTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3result Tff7b72= Te6edf3subprocessTff7b72.Td2a8ffrunTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ffgitTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffshowTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ffHEAD:Tffd700{Te6edf3readme_nameTffd700}Ta5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3cwdTff7b72=Te6edf3repo_pathTb4b4b4, Te6edf3capture_outputTff7b72=Tff7b72TrueTb4b4b4, Te6edf3textTff7b72=Tff7b72TrueTb4b4b4, Te6edf3checkTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3resultTff7b72.Td2a8ffreturncode Tff7b72== T79c0ff0Tb4b4b4: Tff7b72return Te6edf3resultTff7b72.Td2a8ffstdoutTb4b4b4, Te6edf3is_markdown
Tff7b72except Tf85149ExceptionTb4b4b4: Tff7b72continue
Tff7b72return Tff7b72NoneTb4b4b4, Tff7b72False

T8b949e###################
T8b949e# Utility Methods #
T8b949e###################

Tff7b72def Td2a8ffformat_sizeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3size_bytesTb4b4b4)Tb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Te6edf3size_bytesTb4b4b4)

Tff7b72def Td2a8ffformat_absolute_timeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3timestampTb4b4b4)Tb4b4b4:
Te6edf3dt Tff7b72= Te6edf3datetimeTff7b72.Td2a8fffromtimestampTb4b4b4(Te6edf3timestampTb4b4b4)
Tff7b72return Te6edf3dtTff7b72.Td2a8ffstrftimeTb4b4b4(Ta5d6ff'Ta5d6ff%Ta5d6ffY-Ta5d6ff%Ta5d6ffm-Tffd700%dTa5d6ff Ta5d6ff%Ta5d6ffH:Ta5d6ff%Ta5d6ffM:Ta5d6ff%Ta5d6ffSTa5d6ff'Tb4b4b4)

Tff7b72def Td2a8ffformat_relative_timeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3timestampTb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3diff Tff7b72= Te6edf3now Tff7b72- Te6edf3timestamp

Tff7b72if Te6edf3diff Tff7b72< T79c0ff60Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffjust nowTa5d6ff"
Tff7b72elif Te6edf3diff Tff7b72< T79c0ff3600Tb4b4b4:
Te6edf3minutes Tff7b72= Tffa657intTb4b4b4(Te6edf3diff Tff7b72/ T79c0ff60Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3minutesTffd700}Ta5d6ff minuteTffd700{Ta5d6ff'Ta5d6ffsTa5d6ff' Tff7b72if Te6edf3minutes Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff agoTa5d6ff"
Tff7b72elif Te6edf3diff Tff7b72< T79c0ff86400Tb4b4b4:
Te6edf3hours Tff7b72= Tffa657intTb4b4b4(Te6edf3diff Tff7b72/ T79c0ff3600Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3hoursTffd700}Ta5d6ff hourTffd700{Ta5d6ff'Ta5d6ffsTa5d6ff' Tff7b72if Te6edf3hours Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff agoTa5d6ff"
Tff7b72elif Te6edf3diff Tff7b72< T79c0ff604800Tb4b4b4:
Te6edf3days Tff7b72= Tffa657intTb4b4b4(Te6edf3diff Tff7b72/ T79c0ff86400Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3daysTffd700}Ta5d6ff dayTffd700{Ta5d6ff'Ta5d6ffsTa5d6ff' Tff7b72if Te6edf3days Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff agoTa5d6ff"
Tff7b72elif Te6edf3diff Tff7b72< T79c0ff2592000Tb4b4b4:
Te6edf3weeks Tff7b72= Tffa657intTb4b4b4(Te6edf3diff Tff7b72/ T79c0ff604800Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3weeksTffd700}Ta5d6ff weekTffd700{Ta5d6ff'Ta5d6ffsTa5d6ff' Tff7b72if Te6edf3weeks Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff agoTa5d6ff"
Tff7b72elif Te6edf3diff Tff7b72< T79c0ff31536000Tb4b4b4:
Te6edf3months Tff7b72= Tffa657intTb4b4b4(Te6edf3diff Tff7b72/ T79c0ff2592000Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3monthsTffd700}Ta5d6ff monthTffd700{Ta5d6ff'Ta5d6ffsTa5d6ff' Tff7b72if Te6edf3months Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff agoTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3years Tff7b72= Tffa657intTb4b4b4(Te6edf3diff Tff7b72/ T79c0ff31536000Tb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff"Tffd700{Te6edf3yearsTffd700}Ta5d6ff yearTffd700{Ta5d6ff'Ta5d6ffsTa5d6ff' Tff7b72if Te6edf3years Tff7b72!= T79c0ff1 Tff7b72else Ta5d6ff'Ta5d6ff'Tffd700}Ta5d6ff agoTa5d6ff"

Tff7b72def Td2a8ffformat_diffTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3diff_textTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3lines Tff7b72= Te6edf3diff_textTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)
Te6edf3formatted_lines Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3line Tff7b72in Te6edf3linesTb4b4b4:
Tff7b72if Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff+Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff+++Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F0a0Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3lineTb4b4b4)Tffd700}Ta5d6ff`fTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff---Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Ta5d6fffTa5d6ff"Tffea00\\Tffd700{Te6edf3lineTffd700}Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F900Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3lineTb4b4b4)Tffd700}Ta5d6ff`fTa5d6ff"Tb4b4b4)
Tff7b72elif Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff@@Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F0aaTffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3lineTb4b4b4)Tffd700}Ta5d6ff`fTa5d6ff"Tb4b4b4)

Tff7b72elif Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffdiff Ta5d6ff"Tb4b4b4) Tff7b72or Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffindex Ta5d6ff"Tb4b4b4) Tff7b72or Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffnew fileTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffdeleted fileTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3lineTff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ffdiff --git aTa5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ff`F666Tffd700{Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3lineTb4b4b4)Tffd700}Ta5d6ff`fTa5d6ff"Tb4b4b4)

Tff7b72elseTb4b4b4: Te6edf3formatted_linesTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffm_escapeTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4)
Tff7b72return Ta5d6ff"Tffea00\nTa5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3formatted_linesTb4b4b4)


Tff7b72def Td2a8ffrepository_thanksTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3repo_pathTb4b4b4, Te6edf3addTff7b72=Tff7b72FalseTb4b4b4, Te6edf3link_idTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3addTb4b4b4:
Te6edf3thanks_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3link_idTff7b72+Te6edf3repo_pathTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3thanks_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffthanks_dequeTb4b4b4: Te6edf3add Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffthanks_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3thanks_hashTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3thanks_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3repo_pathTffd700}Ta5d6ff.thanksTa5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3thanks_pathTb4b4b4)Tb4b4b4:
Te6edf3thanks_count Tff7b72= T79c0ff1 Tff7b72if Te6edf3add Tff7b72else T79c0ff0
Tff7b72with Tffa657openTb4b4b4(Te6edf3thanks_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3fhTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Te6edf3thanks_countTb4b4b4}Tb4b4b4)Tb4b4b4)

Tff7b72elseTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3thanks_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4:
Te6edf3thanks_data Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffcountTa5d6ff" Tff7b72in Te6edf3thanks_dataTb4b4b4: Te6edf3thanks_count Tff7b72= Te6edf3thanks_dataTb4b4b4[Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in thanks fileTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3addTb4b4b4: Te6edf3thanks_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72with Tffa657openTb4b4b4(Te6edf3thanks_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3fhTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Te6edf3thanks_countTb4b4b4}Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3thanks_count

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while processing repository thanks for Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return T79c0ff0

Tff7b72def Td2a8ffrelease_thanksTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3release_pathTb4b4b4, Te6edf3addTff7b72=Tff7b72FalseTb4b4b4, Te6edf3link_idTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3addTb4b4b4:
Te6edf3thanks_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3link_idTff7b72+Te6edf3release_pathTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3thanks_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffthanks_dequeTb4b4b4: Te6edf3add Tff7b72= Tff7b72False
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffthanks_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3thanks_hashTb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3thanks_path Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3release_pathTffd700}Ta5d6ff/THANKSTa5d6ff"
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3thanks_pathTb4b4b4)Tb4b4b4:
Te6edf3thanks_count Tff7b72= T79c0ff1 Tff7b72if Te6edf3add Tff7b72else T79c0ff0
Tff7b72with Tffa657openTb4b4b4(Te6edf3thanks_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3fhTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Te6edf3thanks_countTb4b4b4}Tb4b4b4)Tb4b4b4)

Tff7b72elseTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3thanks_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4:
Te6edf3thanks_data Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3fhTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72if Ta5d6ff"Ta5d6ffcountTa5d6ff" Tff7b72in Te6edf3thanks_dataTb4b4b4: Te6edf3thanks_count Tff7b72= Te6edf3thanks_dataTb4b4b4[Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid data in thanks fileTa5d6ff"Tb4b4b4)

Tff7b72if Te6edf3addTb4b4b4: Te6edf3thanks_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72with Tffa657openTb4b4b4(Te6edf3thanks_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fhTb4b4b4: Te6edf3fhTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffcountTa5d6ff"Tb4b4b4: Te6edf3thanks_countTb4b4b4}Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3thanks_count

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffError while processing release thanks for Tffd700{Te6edf3group_nameTffd700}Ta5d6ff/Tffd700{Te6edf3repo_nameTffd700}Ta5d6ff: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return T79c0ff0

T8b949e###################
T8b949e# Stats Renderers #
T8b949e###################

Tff7b72def Td2a8ffrender_chartTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3labelsTb4b4b4, Te6edf3colorTff7b72=Ta5d6ff"Ta5d6ff666Ta5d6ff"Tb4b4b4, Te6edf3heightTff7b72=T79c0ff10Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3data Tff7b72or Tffa657allTb4b4b4(Te6edf3d Tff7b72== T79c0ff0 Tff7b72for Te6edf3d Tff7b72in Te6edf3dataTb4b4b4)Tb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffNo data availableTffea00\nTa5d6ff"
Te6edf3max_val Tff7b72= Tffa657maxTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72if Tffa657maxTb4b4b4(Te6edf3dataTb4b4b4) Tff7b72> T79c0ff0 Tff7b72else T79c0ff1
Te6edf3num_points Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3hsep Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3indent Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3bar_width Tff7b72= T79c0ff1

Te6edf3chart_lines Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3chart_linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indentTffd700}Ta5d6ff`FTffd700{Te6edf3colorTffd700}Ta5d6ffPeak: Tffd700{Te6edf3max_valTffd700}Ta5d6ff`fTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3row Tff7b72in Tffa657rangeTb4b4b4(Te6edf3heightTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
Te6edf3threshold Tff7b72= Tb4b4b4(Te6edf3row Tff7b72- T79c0ff1Tb4b4b4) Tff7b72/ Te6edf3height Tff7b72* Te6edf3max_val
Te6edf3row_line Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3indentTffd700}Ta5d6ffβ”‚Ta5d6ff"
Tff7b72for Te6edf3val Tff7b72in Te6edf3dataTb4b4b4:
Tff7b72if Te6edf3val Tff7b72> Te6edf3thresholdTb4b4b4:
Tff7b72if Te6edf3row Tff7b72>Tff7b72= Te6edf3height Tff7b72* T79c0ff0.875Tb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`FTffd700{Te6edf3colorTffd700}Tffd700{Ta5d6ff'Ta5d6ffβ–ˆTa5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elif Te6edf3row Tff7b72>Tff7b72= Te6edf3height Tff7b72* T79c0ff0.625Tb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`FTffd700{Te6edf3colorTffd700}Tffd700{Ta5d6ff'Ta5d6ffβ–“Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elif Te6edf3row Tff7b72>Tff7b72= Te6edf3height Tff7b72* T79c0ff0.375Tb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`FTffd700{Te6edf3colorTffd700}Tffd700{Ta5d6ff'Ta5d6ffβ–’Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`FTffd700{Te6edf3colorTffd700}Tffd700{Ta5d6ff'Ta5d6ffβ–‘Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Ta5d6ff'Ta5d6ff Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Tffd700{Te6edf3hsepTffd700}Ta5d6ff"
Te6edf3row_line Tff7b72+Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff"
Te6edf3chart_linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3row_lineTb4b4b4)
Te6edf3hsj Tff7b72= Ta5d6ff"Ta5d6ffβ”΄Ta5d6ff"Tff7b72*Tffa657lenTb4b4b4(Te6edf3hsepTb4b4b4)
Te6edf3bottom_border Tff7b72= Ta5d6ff"Ta5d6ffβ””Ta5d6ff" Tff7b72+ Te6edf3hsjTff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff─Ta5d6ff" Tff7b72* Te6edf3bar_widthTb4b4b4] Tff7b72* Te6edf3num_pointsTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ffβ”˜Ta5d6ff"
Te6edf3chart_linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3indent Tff7b72+ Te6edf3bottom_border Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3chart_width Tff7b72= Tffa657lenTb4b4b4(Te6edf3bottom_borderTb4b4b4)
Te6edf3first_label Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3labelsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tffd700:Ta5d6ff<12Tffd700}Ta5d6ff"
Te6edf3final_label Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3labelsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tffd700:Ta5d6ff>12Tffd700}Ta5d6ff"
Te6edf3middle_space Tff7b72= Te6edf3chart_widthTff7b72-Tffa657lenTb4b4b4(Te6edf3first_labelTb4b4b4)Tff7b72-Tffa657lenTb4b4b4(Te6edf3final_labelTb4b4b4)

Te6edf3label_line Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3indentTffd700}Ta5d6ff`F666Tffd700{Te6edf3first_labelTffd700}Ta5d6ff`fTa5d6ff"
Te6edf3label_line Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72* Te6edf3middle_space
Te6edf3label_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`F666Tffd700{Te6edf3final_labelTffd700}Ta5d6ff`fTffea00\nTa5d6ff"
Te6edf3chart_linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3label_lineTb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3chart_linesTb4b4b4)

T8b949e# TODO: This is a weird idea, really. Probably redo it to something else.
Tff7b72def Td2a8ffrender_combined_chartTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3viewsTb4b4b4, Te6edf3fetchesTb4b4b4, Te6edf3pushesTb4b4b4, Te6edf3labelsTb4b4b4, Te6edf3heightTff7b72=T79c0ff4Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3views Tff7b72or Tff7b72not Te6edf3labelsTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ffNo data availableTffea00\nTa5d6ff"
Te6edf3all_data Tff7b72= Tb4b4b4[Te6edf3v Tff7b72+ Te6edf3f Tff7b72+ Te6edf3p Tff7b72for Te6edf3vTb4b4b4, Te6edf3fTb4b4b4, Te6edf3p Tff7b72in Tffa657zipTb4b4b4(Te6edf3viewsTb4b4b4, Te6edf3fetchesTb4b4b4, Te6edf3pushesTb4b4b4)Tb4b4b4]
Te6edf3max_val Tff7b72= Tffa657maxTb4b4b4(Te6edf3all_dataTb4b4b4) Tff7b72if Tffa657allTb4b4b4(Te6edf3all_dataTb4b4b4) Tff7b72> T79c0ff0 Tff7b72else T79c0ff1
Te6edf3num_points Tff7b72= Tffa657lenTb4b4b4(Te6edf3viewsTb4b4b4)
Te6edf3hsep Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3indent Tff7b72= Ta5d6ff"Ta5d6ff"
Te6edf3bar_width Tff7b72= T79c0ff1

Te6edf3lines Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Te6edf3indentTffd700}Ta5d6ff`F66dβ–ˆβ–ˆ`f Views `F0a0β–ˆβ–ˆ`f Fetches `Faa0β–ˆβ–ˆ`f PushesTffea00\nTffea00\nTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3row Tff7b72in Tffa657rangeTb4b4b4(Te6edf3heightTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
Te6edf3threshold Tff7b72= Tb4b4b4(Te6edf3row Tff7b72- T79c0ff1Tb4b4b4) Tff7b72/ Te6edf3height Tff7b72* Te6edf3max_val
Te6edf3row_line Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3indentTffd700}Ta5d6ffβ”‚Ta5d6ff"
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Te6edf3num_pointsTb4b4b4)Tb4b4b4:
Te6edf3vTb4b4b4, Te6edf3fTb4b4b4, Te6edf3p Tff7b72= Te6edf3viewsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3fetchesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Te6edf3pushesTb4b4b4[Te6edf3iTb4b4b4]
Te6edf3total Tff7b72= Te6edf3v Tff7b72+ Te6edf3f Tff7b72+ Te6edf3p
Tff7b72if Te6edf3total Tff7b72> Te6edf3thresholdTb4b4b4:
T8b949e# Determine which "layer" this row represents
T8b949e# Priority: Pushes > fetches > views for display
Tff7b72if Te6edf3p Tff7b72> T79c0ff0 Tff7b72and Te6edf3threshold Tff7b72< Tb4b4b4(Te6edf3v Tff7b72+ Te6edf3f Tff7b72+ Te6edf3pTb4b4b4) Tff7b72and Te6edf3threshold Tff7b72>Tff7b72= Tb4b4b4(Te6edf3v Tff7b72+ Te6edf3fTb4b4b4)Tb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`Faa0Tffd700{Ta5d6ff'Ta5d6ffβ–ˆTa5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elif Te6edf3f Tff7b72> T79c0ff0 Tff7b72and Te6edf3threshold Tff7b72< Tb4b4b4(Te6edf3v Tff7b72+ Te6edf3fTb4b4b4) Tff7b72and Te6edf3threshold Tff7b72>Tff7b72= Te6edf3vTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`F0a0Tffd700{Ta5d6ff'Ta5d6ffβ–“Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elif Te6edf3v Tff7b72> T79c0ff0 Tff7b72and Te6edf3threshold Tff7b72< Te6edf3vTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`F66dTffd700{Ta5d6ff'Ta5d6ffβ–‘Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4:
T8b949e# Mixed or partial, show dominant
Tff7b72if Te6edf3p Tff7b72>Tff7b72= Te6edf3f Tff7b72and Te6edf3p Tff7b72>Tff7b72= Te6edf3vTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`Faa0Tffd700{Ta5d6ff'Ta5d6ffβ–’Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elif Te6edf3f Tff7b72>Tff7b72= Te6edf3vTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`F0a0Tffd700{Ta5d6ff'Ta5d6ffβ–’Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`F66dTffd700{Ta5d6ff'Ta5d6ffβ–’Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Ta5d6ff`fTffd700{Te6edf3hsepTffd700}Ta5d6ff"
Tff7b72elseTb4b4b4: Te6edf3row_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Ta5d6ff'Ta5d6ff Ta5d6ff'Tff7b72*Te6edf3bar_widthTffd700}Tffd700{Te6edf3hsepTffd700}Ta5d6ff"
Te6edf3row_line Tff7b72+Tff7b72= Ta5d6ff"Tffea00\nTa5d6ff"
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3row_lineTb4b4b4)
Te6edf3hsj Tff7b72= Ta5d6ff"Ta5d6ffβ”΄Ta5d6ff"Tff7b72*Tffa657lenTb4b4b4(Te6edf3hsepTb4b4b4)
Te6edf3bottom_border Tff7b72= Ta5d6ff"Ta5d6ffβ””Ta5d6ff" Tff7b72+ Te6edf3hsjTff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Ta5d6ff"Ta5d6ff─Ta5d6ff" Tff7b72* Te6edf3bar_widthTb4b4b4] Tff7b72* Te6edf3num_pointsTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ffβ”˜Ta5d6ff"
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3indent Tff7b72+ Te6edf3bottom_border Tff7b72+ Ta5d6ff"Tffea00\nTa5d6ff"Tb4b4b4)

Te6edf3chart_width Tff7b72= Tffa657lenTb4b4b4(Te6edf3bottom_borderTb4b4b4)
Te6edf3first_label Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3labelsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tffd700:Ta5d6ff<12Tffd700}Ta5d6ff"
Te6edf3final_label Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3labelsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tffd700:Ta5d6ff>12Tffd700}Ta5d6ff"
Te6edf3middle_space Tff7b72= Te6edf3chart_widthTff7b72-Tffa657lenTb4b4b4(Te6edf3first_labelTb4b4b4)Tff7b72-Tffa657lenTb4b4b4(Te6edf3final_labelTb4b4b4)

Te6edf3label_line Tff7b72= Ta5d6fffTa5d6ff"Tffd700{Te6edf3indentTffd700}Ta5d6ff`F666Tffd700{Te6edf3first_labelTffd700}Ta5d6ff`fTa5d6ff"
Te6edf3label_line Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff" Tff7b72* Te6edf3middle_space
Te6edf3label_line Tff7b72+Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff`F666Tffd700{Te6edf3final_labelTffd700}Ta5d6ff`fTffea00\nTa5d6ff"
Te6edf3linesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3label_lineTb4b4b4)
Tff7b72return Ta5d6ff"Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3linesTb4b4b4)

T8b949e#######################
T8b949e# Connection Handlers #
T8b949e#######################

Tff7b72def Td2a8ffremote_connectedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeer connected to Tffd700{Tff7b72selfTff7b72.Td2a8ffdestinationTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_remote_identified_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffremote_identifiedTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_link_closed_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffremote_disconnectedTb4b4b4)

Tff7b72def Td2a8ffremote_disconnectedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeer disconnected from Tffd700{Tff7b72selfTff7b72.Td2a8ffdestinationTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffremote_identifiedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeer identified as Tffd700{Te6edf3linkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff on Tffd700{Te6edf3linkTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

T8b949e######################
T8b949e# Permission Control #
T8b949e######################

Tff7b72def Td2a8ffget_accessible_groupsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4)Tb4b4b4:
Te6edf3accessible_groups Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3group_nameTb4b4b4, Te6edf3group_data Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffgroupsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3accessible_repos Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_accessible_repositoriesTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4)
Tff7b72if Te6edf3accessible_reposTb4b4b4:
Te6edf3accessible_groupsTb4b4b4[Te6edf3group_nameTb4b4b4] Tff7b72= Tb4b4b4{ Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4: Te6edf3group_dataTb4b4b4[Ta5d6ff"Ta5d6ffpathTa5d6ff"Tb4b4b4]Tb4b4b4, Ta5d6ff"Ta5d6ffrepositoriesTa5d6ff"Tb4b4b4: Te6edf3accessible_repos Tb4b4b4}
Tff7b72return Te6edf3accessible_groups

Tff7b72def Td2a8ffget_accessible_repositoriesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3group_name Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffgroupsTb4b4b4: Tff7b72return Tb4b4b4{Tb4b4b4}
Te6edf3group_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffgroupsTb4b4b4[Te6edf3group_nameTb4b4b4]
Te6edf3all_repos Tff7b72= Te6edf3group_dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrepositoriesTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)
Te6edf3accessible_repos Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3repo_nameTb4b4b4, Te6edf3repo_data Tff7b72in Te6edf3all_reposTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffresolve_permissionTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffPERM_READTb4b4b4)Tb4b4b4:
Te6edf3accessible_reposTb4b4b4[Te6edf3repo_nameTb4b4b4] Tff7b72= Te6edf3repo_data
Tff7b72return Te6edf3accessible_repos

Tff7b72def Td2a8ffget_accessible_repositoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3group_name Tff7b72not Tff7b72in Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffgroupsTb4b4b4: Tff7b72return Tff7b72None
Te6edf3group_data Tff7b72= Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffgroupsTb4b4b4[Te6edf3group_nameTb4b4b4]
Te6edf3all_repos Tff7b72= Te6edf3group_dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffrepositoriesTa5d6ff"Tb4b4b4, Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tff7b72if Te6edf3repo_name Tff7b72not Tff7b72in Te6edf3all_reposTb4b4b4: Tff7b72return Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffresolve_permissionTb4b4b4(Te6edf3remote_identityTb4b4b4, Te6edf3group_nameTb4b4b4, Te6edf3repo_nameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffPERM_READTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3all_reposTb4b4b4[Te6edf3repo_nameTb4b4b4]
Tff7b72return Tff7b72None

T8b949e# Global base template
Te6edf3DEFAULT_BASE_TEMPLATE Tff7b72= Ta5d6ff"""Ta5d6ff#!c=0
Ta5d6ff>Tffd700{NODE_NAME}

Tffd700{NAVIGATION}
Tffd700{PAGE_CONTENT}
Ta5d6ff<
Ta5d6ff-
Ta5d6ff`a`F666`[Served by rngit Tffd700{VERSION}Ta5d6ff`:/page/index.mu] - Tffd700{GEN_TIME}Ta5d6ff`fTa5d6ff"""

T8b949e# Front page template
Te6edf3DEFAULT_FRONT_TEMPLATE Tff7b72= Ta5d6ff"""Ta5d6ff>Groups

Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Repositories page template
Te6edf3DEFAULT_GROUP_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Repository page template
Te6edf3DEFAULT_REPO_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Repository page template
Te6edf3DEFAULT_RELEASES_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Repository page template
Te6edf3DEFAULT_RELEASE_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Tree page template
Te6edf3DEFAULT_TREE_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Blob page template
Te6edf3DEFAULT_BLOB_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Commits page template
Te6edf3DEFAULT_COMMITS_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Commit page template
Te6edf3DEFAULT_COMMIT_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Refs page template
Te6edf3DEFAULT_REFS_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Stats page template
Te6edf3DEFAULT_STATS_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""

T8b949e# Fallback template
Te6edf3FALLBACK_TEMPLATE Tff7b72= Ta5d6ff"""Tffd700{PAGE_CONTENT}Ta5d6ff"""


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────